在此link的javascript中的promises文档中。写道:
使用已解决的承诺,'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}
我不太明白它会说块会被触发但处理程序被触发异步的部分。我的问题是:
那么块是什么?它的处理程序是什么?它们有何区别?
每个触发什么?
谢谢。
答案 0 :(得分:1)
这句话有点令人困惑,这是我试图解释我认为它意味着什么。如果我在某处弄错了,请毫不犹豫地向我扔石头:)
.then()
方法返回一个promise。我认为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; });
运行并返回promise,但是尚未执行返回值的回调,因此值未定义。
事件循环运行完成后,下一个循环开始并执行回调。此回调将值分配给promise并记录此行:
“这会在主堆栈结束后调用。收到的值 并返回:33“
最后,使用新分配的值记录promise本身:
承诺{[[PromiseStatus]]:“已解决”,[[PromiseValue]]:33}
更直接地回答您的问题:
Then
是Promise上的一个方法,它接受一个回调函数并返回另一个promise。当原始承诺得到解决时,将触发该函数。 .then()
方法本身,它只是一种方法。 正如@Bergi所说,混淆的一个重要原因可能是“阻塞”这个词,这可能仅仅意味着“.then
方法调用中的代码块。”
答案 1 :(得分:0)