[英]Promise.all calling .then too early
我正在努力理解為什么我的實現中的Promise.all會在返回數據之前將promise數組視為已解析。
在我的代碼中,acquireData方法被排除在外,但要點是:
我從該函數返回數據(日志顯示該部分工作正常)
let resultArr = event.map((item) => { return new Promise(acquireData(item)) }) Promise.all(resultArr).then(function(values) { console.log("we are about to return the result!") callback(null, values) }).catch(err => callback(err))
acquisitionData方法的控制台日志為(“獲取的結果”)
我的期望:
我得到的是:
...使得Promise的.then部分沒有任何可用的返回數據。
我缺少基本的東西嗎? 許諾要返回結果有多長時間限制,而我只是超過了? 每次執行AcquisitionData方法都會很快返回(不到1秒)。
編輯:在下面添加了acquireData:
var acquireData = function(event) {
console.log("Called acquireData!")
console.log("event: ")
console.log(event)
if (event.enterprise_id || (event.sourceKey && event.entity && event.domain)) {
//Search by Enterprise ID
if (event.enterprise_id && event.enterprise_id.length === 36) {
let enterprise_id = event.enterprise_id
let params = {
TableName: 'EDM',
KeyConditionExpression: "#enterprise_id = :enterprise_id",
ExpressionAttributeNames:
{
"#enterprise_id": "enterprise_id"
},
ExpressionAttributeValues:
{
":enterprise_id": enterprise_id
}
}
docClient.query(params, function(err, data) {
if (err)
{
console.log("error on querying enterprise id")
return err
//callback(err, null);
}
else
{
if (data.Items.length === 0)
{
let error = {
"status": 404,
errors: [
{
"code": "NotFoundError",
"source": "database",
"message": "enterprise_id Not found",
"detail": "The enterprise_id provided was not found."
}
]
}
//callback(JSON.stringify(error))
console.log("nothing was found based on enterprise id")
return error
} else {
let result = assembleData(data)
console.log("BEGIN ASSEMBLEDATA RESULT")
console.log(result)
console.log("END ASSEMBLEDATA RESULT")
//callback(null, result)
return result
}
}
})
} else if (event.sourceKey) {
let source_key = event.sourceKey
let domain_entity = `${event.domain}\:${event.entity}`.toUpperCase()
console.log("found a source key record")
console.log(event)
let params = {
TableName: 'EDM',
IndexName: 'source_key-domain-entity-index',
KeyConditionExpression: "#source_key = :source_key and #domain_entity = :domain_entity",
ExpressionAttributeNames:
{
"#source_key": "source_key",
"#domain_entity": "domain-entity"
},
ExpressionAttributeValues:
{
":source_key": source_key,
":domain_entity": domain_entity
}
}
docClient.query(params, function(err, data) {
if (err)
{
console.log("error finding by source key")
return err
//callback(err, null);
}
else
{
if (data.Items.length === 0)
{
let error = {
"status": 404,
errors: [
{
"code": "NotFoundError",
"source": "database",
"message": "enterprise_id Not Found",
"detail": "No enterprise_id could be found with the sourceKey and domain/entity combination provided."
}
]
}
//callback(JSON.stringify(error))
console.log("404 source key not found")
return error
} else {
let result = assembleData(data)
let params = {
TableName: 'EDM',
KeyConditionExpression: "#enterprise_id = :enterprise_id",
ExpressionAttributeNames:
{
"#enterprise_id": "enterprise_id"
},
ExpressionAttributeValues:
{
":enterprise_id": result.enterprise_id
}
}
docClient.query(params, function(err, data) {
if (err)
{
//callback(err, null);
return err
}
else
{
if (data.Items.length === 0)
{
let error = {
"status": 404,
errors: [
{
"code": "NotFoundError",
"source": "database",
"message": "enterprise_id Not found",
"detail": "The enterprise_id provided was not found."
}
]
}
//callback(JSON.stringify(error))
console.log("this error should never be hit... it means it found an enterprise id based on provided source key and then didn't find the eid right after that")
return error
} else {
let result = assembleData(data)
//callback(null, result)
console.log("we are about to get a result!")
console.log(result)
return result
}
}
})
}
}
})
} else {
let error = {
"status": 400,
errors: [
{
"code": "InvalidParameterError",
"source": "enterprise_id",
"message": "Value in unexpected format",
"detail": "enterprise_id was in unexpected format. Ensure that the string provided follows the GUID format of XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
]
}
//callback(JSON.stringify(error))
return error
}
} else {
//callback("The enterprise_id or sourceKey and domain/entity must be provided.")
return "The enterprise_id or sourceKey and domain/entity must be provided."
}//endif event.enterprise_id
}
var assembleData = function(data) {
var source_keys = [];
data.Items.forEach((item) => {
source_keys.push({ "domain-entity": item["domain-entity"], "source_key": item.source_key, "date_modified": item._modified })
})
var response = {
enterprise_id: data.Items[0].enterprise_id,
source_keys: source_keys
}
//console.log(JSON.stringify(response))
return response;
}
謝謝你的幫助。
acquisitionData方法本身正在執行對AWS資產的異步調用,但是其中沒有承諾代碼-應該存在嗎?
當然是。 一個執行異步操作的函數應該為該異步操作的結果返回一個承諾。 您說“ 我正在從該函數返回數據 ”,但我懷疑您這樣做 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.