尝试承诺,发现了一些我没有想到的东西。
function Delayer(time){
return new Promise((resolve,reject)=>{
if(time != 0){
setTimeout(()=>resolve("Waited " + (time/1000) + " secs!"),time)
}
else{
resolve("No Time Waited");
}
})
}
var output = "Promise not resolved yet!";
console.log(output);
Delayer(10).then(function(msg){output = msg; console.log(output)});
console.log(output);//this wont change until callback.
Delayer(0).then(function(msg){output = msg; console.log(output)});
console.log(output);
我希望这个承诺能像这样解决:
> Promise not resolved yet!
> Promise not resolved yet!
> No Time Waited
> No Time Waited
> Waited 3 secs!相反,我得到了3“尚未解决”和只有一个“没有时间等待”。显然,在处理即时解析之前,它将一直等到其余代码完成。它是怎么做到的?
在创建一个可能立即解决的承诺时,设计最佳实践是什么?
发布于 2017-10-09 18:25:00
承诺规范要求它们始终异步调用回调,即使承诺已经处于已解决的状态。这是一个非常有益的质量,因为您可以确保您的代码将始终以相同的顺序执行,不管它是否需要等待。如果承诺有时同步调用回调,那么执行顺序将取决于承诺的内部状态,可能会导致错误。
特别是,请参见承诺a+规范的要求2.2.4
在执行上下文堆栈只包含平台代码之前,不能调用
onFulfilled或onRejected。
https://stackoverflow.com/questions/46652715
复制相似问题