以下是演示:
var forever = new Promise(function (resolve, reject) {
while (true) {
}
resolve("done")
});
console.log("Promise returned")
永远不会执行console.log("Promise returned")
。似乎forever
的评估将阻止线程并且永远不会返回。
将函数体包裹到setTimeout
解决了这个问题:
var forever = new Promise(function (resolve, reject) {
setTimeout(function() {
while (true) {
}
resolve("done")
},0)
});
console.log("Promise returned")
Promise
的回调参数不应该延迟才能执行(不需要被setTimeout包装)?有没有关于这种行为的文件?
答案 0 :(得分:3)
Section 25.4.3.1指出“当使用参数执行程序调用Promise函数时”采取以下步骤:
- 让完成为
醇>Call(executor, undefined, «resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]]»)
。
因此,规范要求在构造期间调用Promise
构造函数的回调。 MDN notes thi也是如此:
执行函数立即执行。
executor
函数不一定需要立即调用resolve
或reject
,而是在new Promise
返回之前调用它。
答案 1 :(得分:0)
传递给date = MyModel.objects.order_by('date').first()
name = MyModel.objects.order_by('name').first()
的函数被同步调用。它可以调用其他异步函数,并在这些函数的回调中解析(或拒绝)promise,但如果你直接在该顶级函数中执行new Promise()
,它将立即阻止浏览器。