簡體   English   中英

Promise.All都打電話給。

[英]Promise.all calling .then too early

我正在努力理解為什么我的實現中的Promise.all會在返回數據之前將promise數組視為已解析。

在我的代碼中,acquireData方法被排除在外,但要點是:

  • AcquisitionData方法中沒有承諾代碼-應該存在嗎?
  • acquisitionData方法本身正在執行對AWS資產的異步調用...我是否應該實施其他承諾來等待這些資產? 函數調用本身可以正常工作
  • 我從該函數返回數據(日志顯示該部分工作正常)

      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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM