为什么承诺被设计为立即在内部运行

时间:2016-12-06 21:06:15

标签: javascript promise es6-promise

根据MDN:

  

执行函数由Promise实现立即执行,传递解析和拒绝函数

这个决定的实际原因是什么? 为什么承诺不懒惰?

3 个答案:

答案 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。

因此,将所有同步代码放在执行程序函数中,以统一调用者的错误。这就是它的用途,我认为这是你真正的问题。

“懒惰”执行会破坏统一所有代码的错误处理的目的。