Javascript决定不做预期的事情

时间:2018-06-02 19:40:04

标签: javascript asynchronous promise

在我的承诺中,我有以下代码:

if(a === b){
    resolve();
}

我希望当a === b时,执行Promise.then(),因为我满足此条件时调用resolve()。但它并没有发生,并且在这段代码被愉快地执行后立即编码。

我期待错误的行为吗?java

编辑: 部分代码:

return new Promise(function (resolve, reject) {
var itemCounter = 0;
var noContentCounter = 0;
for(var index=0;index<itemList.length;index++) {
        const item = itemList[index];
        client.get(urls[env] + item['itemId'], function (data, response) {
            itemCounter = itemCounter + 1;
            try {
                if (response.statusCode === 204) {
                    noContentCounter = noContentCounter + 1;
                    if(noContentCounter === itemList.length){
                        resolve();
                    }else {
                        return;
                    }
                }
                ...

因此,如果没有找到列表中任何项目的内容,我希望调用Promise.then(处理下一个列表)而不是执行以下代码。

2 个答案:

答案 0 :(得分:1)

当您调用resolve时,承诺确实已解决,但您对该承诺的then回调只会在当前调用堆栈运行完成后执行。换句话说,即使解决方案同步发生,then回调也是异步执行的。

因此resolve()之后的任何代码都会先“愉快地执行”。如果您不希望这种情况发生,请在该呼叫之后立即放置return。有些人甚至会把它写在一行

return resolve();

...虽然这可能会使一些读者对您的代码感到困惑,因为它似乎表明resolve会返回一个(有用的)值,但事实并非如此。

答案 1 :(得分:0)

https://promisesaplus.com/

  

这里的“平台代码”意味着引擎,环境和承诺   实施代码。在实践中,这个要求确保了这一点   在事件发生后,onFulfilled和onRejected异步执行   循环转入然后调用,并使用新堆栈。这可以   使用“宏任务”机制(如setTimeout或)实现   setImmediate,或者使用“微任务”机制   MutationObserver或process.nextTick

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Return_value

  

处于待定状态的承诺。处理函数(onFulfilled或   onRejected)然后异步调用(只要堆栈是。)   空)