在我的承诺中,我有以下代码:
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(处理下一个列表)而不是执行以下代码。
答案 0 :(得分:1)
当您调用resolve
时,承诺确实已解决,但您对该承诺的then
回调只会在当前调用堆栈运行完成后执行。换句话说,即使解决方案同步发生,then
回调也是异步执行的。
因此resolve()
之后的任何代码都会先“愉快地执行”。如果您不希望这种情况发生,请在该呼叫之后立即放置return
。有些人甚至会把它写在一行
return resolve();
...虽然这可能会使一些读者对您的代码感到困惑,因为它似乎表明resolve
会返回一个(有用的)值,但事实并非如此。
答案 1 :(得分:0)
这里的“平台代码”意味着引擎,环境和承诺 实施代码。在实践中,这个要求确保了这一点 在事件发生后,onFulfilled和onRejected异步执行 循环转入然后调用,并使用新堆栈。这可以 使用“宏任务”机制(如setTimeout或)实现 setImmediate,或者使用“微任务”机制 MutationObserver或process.nextTick
处于待定状态的承诺。处理函数(onFulfilled或 onRejected)然后异步调用(只要堆栈是。) 空)