根据MDN:
执行函数由Promise实现立即执行,传递解析和拒绝函数
这个决定的实际原因是什么? 为什么承诺不懒惰?
答案 0 :(得分:4)
这个决定的实际原因是什么?
带回调的显式Promise
构造函数只是improvement over the older deferred pattern。回调从来没有打算在评估时提供选择,它应该为解析器函数提供一个错误处理范围。
为什么承诺不是懒惰的?
因为promises代表异步结果值,仅此而已。它们保持简单,没有懒惰(并代表整个计算,使用方法来启动/重复/等)。通过使用返回promise的函数,您可以轻而易举地获得它。
答案 1 :(得分:1)
Promises旨在提供延续,标准Promise
对象的实际状态提出以下模式:
function doStuff() {
return new Promise((resolve, reject) => { // execution function
// Do stuff here
});
}
我会问自己一个问题,以了解为什么Promise
的执行功能被立即调用:你会在哪里做承诺的事情?
答案 2 :(得分:0)
承诺的要点是从调用者可以附加回调的函数返回一些东西,而不是传递它们。构造函数是一个回答“为什么”的红色鲱鱼,因为它仅用于包装旧的回调在一个不完美的世界中的代码。
所有JS函数都是同步的,即使是那些返回promise的函数(es8的async
也是语法糖)。
Promise构造函数执行程序函数用于提供统一的错误处理。考虑:
function foo() {
""(); // throws TypeError
return Promise(resolve => {
""(); // rejects promise with TypeError
});
}
来电者需要try{ foo().catch(failed); } catch(e) { failed(e); }
= Sucks。
因此,将所有同步代码放在执行程序函数中,以统一调用者的错误。这就是它的用途,我认为这是你真正的问题。
“懒惰”执行会破坏统一所有代码的错误处理的目的。