承诺如何处理即时解决方案



尝试承诺,发现了一些我没想到的东西。

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 个"尚未解决",只有一个"没有时间等待"。它显然要等到代码的其余部分完成,然后再处理即时解析。它是如何做到这一点的?

在创建可能立即解决的承诺时,设计最佳实践是什么?

承诺的规范要求它们始终异步调用回调,即使承诺已处于已解决状态也是如此。这是一个非常有益的品质,因为您可以确定您的代码将始终以相同的顺序执行,无论它是否必须等待。如果 promise 有时会同步调用回调,则执行顺序将取决于 promise 的内部状态,这可能会导致错误。

具体而言,请参阅承诺 a+ 规范的要求 2.2.4:

在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilledonRejected

最新更新