1

在此链接中的 javascript 中的承诺文档中。这个已经写完了:

使用已解决的承诺,“then”块将立即触发,但其处理程序将异步触发

// using a resolved promise, the 'then' block will be triggered instantly, 
// but its handlers will be triggered asynchronously as demonstrated by the console.logs

var resolvedProm = Promise.resolve(33);

var thenProm = resolvedProm.then(function(value){
    console.log("this gets called after the end of the main stack. the value 
    received and returned is: " + value);
    return value;
});

// instantly logging the value of thenProm
console.log(thenProm);

// using setTimeout we can postpone the execution of a function to the moment 
// the stack is empty

setTimeout(function(){
   console.log(thenProm);
});

// logs, in order:
// Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
// "this gets called after the end of the main stack. the value received and returned is: 33"
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 33}

我不太明白它所说的块将被触发但处理程序被异步触发的部分。我的问题是:

  1. then 块是什么?它的处理程序是什么,它们有何不同?

  2. 每个触发什么?

  3. 当该异步触发器发生时,它毕竟被解决了

谢谢你。

4

2 回答 2

1

这句话有点令人困惑,这是我试图解释我认为的意思。如果我在某个地方弄错了,请不要犹豫,向我扔石头:)

.then()方法返回一个承诺。我认为the 'then' block will be triggered instantly这意味着该.then方法在事件循环的当前运行中运行,并将立即返回承诺。但是,您传递给该then方法的回调将异步执行,即在事件循环的以下运行中。

因此,在该示例中,第一个记录的行是

Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

因为这:

var thenProm = resolvedProm.then(function(value){
    console.log("this gets called after the end of the main stack. the value 
    received and returned is: " + value);
    return value; });

运行并返回承诺,但返回值的回调尚未执行,因此该值未定义。

事件循环运行完成后,下一个开始并执行回调。此回调将值分配给承诺并记录以下行:

“这在主堆栈结束后被调用。接收和返回的值为:33”

最后,使用新分配的值记录承诺本身:

承诺 {[[PromiseStatus]]: "已解决", [[PromiseValue]]: 33}

要更直接地回答您的问题:

  1. Then是 Promise 上的一个方法,它接受一个回调函数并返回另一个 Promise。当原始承诺被解决时,该函数将被触发。
  2. 当原始承诺被解决或拒绝时,这就是触发在“then”方法中传递的回调函数的原因。没有什么“触发”.then()方法本身,它只是一种方法。
  3. 承诺的解决是触发回调的原因。

正如@Bergi 所说,混淆的一大来源可能是“块”这个词,这里可能只是表示“.then方法调用中的代码块”。

于 2018-04-13T09:30:56.190 回答
0
  1. 然后 block 是 Promise 对象的方法。它用于注册回调,当 Promise 完成或被拒绝时会调用它。
  2. 在您创建 Promise 实例时及时触发。当 Promise 将被解决或拒绝时,将调用 Handler
于 2018-04-13T09:52:11.140 回答