.Then не запускается после выполнения обещания на AWS Lambda - PullRequest
0 голосов
/ 25 октября 2019

Код:

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 должна запускать асинхронную функцию несколько раз и разрешать Обещание, которое она вызвала при получении последнего ответа. if(responses == rules.length) работает должным образом и регистрирует «Resolved» в консоли. Все прошло успешно, без ошибок.

Ниже приведен контекст этого кода, функция iterateRules выполняется, а последующая .then - нет. Если я вставлю resolve() в обещание напрямую, оно выполнится. Что может быть не так с этим скриптом? Я попытался запустить простую версию, которая выглядит следующим образом:

var res, rej;

function dude(){
    res()
}

new Promise((resolve, reject) => {
    res = resolve;
    dude()
}).then((dude) => {
    console.log("resolved")
})

И это действительно работает, так что я очень запутался. Что может вызвать проблему? Заранее спасибо.

1 Ответ

1 голос
/ 25 октября 2019

Я бы заставил iterateRules() вернуть обещание (так как оно асинхронное). Я также обещал бы функцию CWevents.putRule(), чтобы вы могли выполнить некоторый код, подобный приведенному ниже:

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

Тогда ваш обработчик для iterateRules станет:

iterateRules(rules,params).then(()=>{
    // Do something...
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...