承诺如何运作?

时间:2018-03-20 05:16:39

标签: javascript promise

我正在学习JS中的Promise,我几乎没有与之相关的查询。

这是我的代码段,

var promise = new Promise(
  (resolve, reject) => {
    var data = 'resolve';
    resolve(data);
    console.log('promise executor');
  });

setTimeout(
  () => {
    promise.then(
      (data) => {
        console.log(data);
      });
    promise.then(
      (data) => {
        console.log(data);
      });
  }, 2000);

输出为,

promise executor
resolve
resolve

从上面的输出中,我了解到executor的主体在构建Promise期间立即执行。现在,我的疑问/疑问如下,

  1. executor执行期间,resolve实际上是未定义的。不过,浏览器不会抛出错误并丢弃通话,怎么样?
  2. {2}延迟后设置resolve功能。尽管executor已经执行并且data变量已经失去生命,浏览器仍会调用该函数。怎么样?
  3. 第二次设置resolve也会产生输出。它对.then()的调用次数是否有限制?

2 个答案:

答案 0 :(得分:1)

  1. resolve promise构造函数有一个自然参数 - 存在。 (可以随意添加console.log(typeof resolve);
  2. 此时,承诺已经运行,现在是一个已解决的承诺,其值为'resolve'。 data变量此时并不存在,但是承诺仍然以'resolve'值解决。因此,添加到承诺中的.then将立即以该值运行。
  3. 不,没有限制 - 这是关于承诺的伟大事情之一,你可以传递它们而不仅限于一个.then。如果需要,请查看文档:{​​{3}}

答案 1 :(得分:1)

1 。承诺可能处于以下三种可能状态之一:已履行,已拒绝或待处理。承诺用户可以附加回调来处理已履行的价值或拒绝的原因。

promise构造函数接受一个参数,一个带有两个参数的回调,解析和拒绝。在回调中做一些事情,也许是异步,然后在一切正常的情况下调用resolve,否则调用reject。

promise是一个可以从异步函数同步返回的对象。它将处于以下三种可能状态之一:

已实现:将调用onFulfilled()(例如,调用resolve())

拒绝:将调用onRejected()(例如,调用reject())

待定:尚未履行或拒绝

如果承诺没有待决(已经解决或拒绝),则承诺得到解决。有时候人们使用已经解决并且已经解决了同样的事情:没有待决。 一旦安顿下来,承诺就无法重新安置。再次调用resolve()或reject()将不起作用。固定承诺的不变性是一个重要特征。

2 。事实承诺有时不立即解决,有时推迟意味着API是一致的。否则,您将按执行顺序获得未定义的行为。

3 。一旦承诺得到解决,.then函数会立即被调用,因此,如果对于一个承诺,您编写了n.then个函数,则所有将同时执行与解决方案中发送的相同数据。