Promises如何处理立即解决?

时间:2017-10-09 18:22:25

标签: javascript promise

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



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能够解决这个问题:

> Promise not resolved yet!
> Promise not resolved yet!
> No Time Waited
> No Time Waited
> Waited 3 secs!

相反,我得到3"尚未解决,只有一个"没有时间等待"。在处理立即解决之前,它会清楚地等待代码的其余部分完成。它是如何做到的?

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

1 个答案:

答案 0 :(得分:6)

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

特别参见Promise a+ spec的要求2.2.4:

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

onFulfilledonRejected