A。然后在AWS Lambda上解决了承诺后便无法运行

问题描述 投票:0回答:1

代码:

var promiseResolve, promiseReject;    

function iterateRules(rules, params, i = 0) {

    CWevents.putRule(rules[i], function(err, data) {    // This is an async function with a callback
        if (err) console.log(err); promiseReject(err)

        responses++
        params['Lambda_invoke']['SourceArns'].push(data.RuleArn)

        if(responses == rules.length){ promiseResolve("Success"); console.log("Resolved")} 
        // After two responses are confirmed, this if does run and I get the "Resolved"
    })
    i++
    if(i < rules.length){
        setTimeout( function(){
            iterateRules(params['CW_rules']['Rules'], params, i)
        }, 50)
    }
}

new Promise((resolve, reject) => {
    resolve() 
// This part is added solely for the code to make sense, it's taken out of a 
// bigger script and lots of unnecessary data is removed 
})
.then((Item) => {
            return new Promise((resolve, reject) => {
                promiseReject = reject;
                promiseResolve = resolve;
                iterateRules(params['CW_rules']['Rules'], params)
            })
}) .then((res) => {
        console.log("This ran")
   })

iterateRules函数应该多次运行一个异步函数,并解决在获取最后一个响应时调用它的Promise。 if(responses == rules.length)确实按预期运行,并在控制台中记录了“已解决”。一切都成功,没有错误。

在此代码的上下文下面,执行了iterateRules函数,但没有执行。如果我直接在承诺中放入.then,它就会执行。此脚本可能有什么问题?我尝试单独运行它的简单版本,如下所示:

resolve()

事实上它确实有效,所以我很困惑。什么可能导致问题?

javascript amazon-web-services asynchronous aws-lambda es6-promise
1个回答
1
投票
我会让var res, rej; function dude(){ res() } new Promise((resolve, reject) => { res = resolve; dude() }).then((dude) => { console.log("resolved") }) 返回一个Promise(因为它是异步的)。我还要保证iterateRules()函数的正确性,因此您可以完成如下代码:

CWevents.putRule()

然后您的iterateRules的处理程序将成为:

function iterateRules(rules, params) { return Promise.all(rules.map(rule => { return CWevents.putRule(rule) })).then((data) => { params['Lambda_invoke']['SourceArns'].push(data.RuleArn) }) }

© www.soinside.com 2019 - 2024. All rights reserved.