当我有以下代码时:
var promise1 = Promise.resolve([1, 2, 3]);
promise1.then((value) => {
console.log(value);
// expected output: Array [1, 2, 3]
});
console.log('end of script');
我知道脚本的结尾是早先返回的,因为promise
是异步的。但是在执行的哪个阶段它变得异步?
Promise.resolve()
是否异步?
或.then
是异步的还是两个函数?
引擎盖下还有其他一些机制吗?
(因为我只获得了新async await
功能的结果,所以谷歌是一个地狱)
答案 0 :(得分:6)
Promise.resolve([1, 2, 3]);
Promise.resolve()是异步的吗?
不,这只是一个常规的函数调用。它将返回 immeadiately 的结果。
或者是.then是异步的,甚至是两个函数
没有。
意义上的两者都不是异步的promise1.then((value) => console.log(value));
将 immeadiately 返回一个新的链接承诺。
然而,Promise definetly 异步解析 ,这意味着在执行整个同步代码后,内部函数(value => console.log(value)
)将被确定地调用。
引擎盖下是否还有其他机制?
是的,有一个"魔法" 事件循环在后台管理所有异步事件。
答案 1 :(得分:4)
所有答案都很好,但我想在这里提一点微妙的观点。在JS中,并非所有异步动物都是平等的。 Promises使用微任务队列,而oldschool异步回调使用事件队列。
以下代码请在运行之前尝试猜测日志的顺序..
console.log("Code starts here");
setTimeout(console.log,0,"setTimeout resolved");
Promise.resolve("promise resolved")
.then(s => (console.log(s), "yet another promise resolved"))
.then(s => console.log(s));
console.log("Code ends here")
因此,当您看到Promises使用的微任务队列对事件队列具有特权时,当时间到来时,微任务队列头部的指令优先于事件队列头部的指令,即使他们都像上面一样同时解决。
答案 2 :(得分:3)
以下是发生的事情的确切顺序。在开始之前,您应该注意Promise对象始终处于以下三种状态之一:
首先,promise1
被分配了一个承诺,该承诺位于"已解决"最终值为[1,2,3]的州:
var promise1 = Promise.resolve([1, 2, 3]);
接下来,我们要求,一旦promise1
进入解析状态,我们就会记录其最终值。 然而,在整个程序通过并执行进入Javascript事件循环之前,承诺中的.then(),。catch()等永远不会被评估。因此,这段代码注册将要完成但未实际完成的未来行动;这段代码立即返回而没有完成。
promise1.then((value) => {
console.log(value);
// expected output: Array [1, 2, 3]
});
之后,我们打印一些文字:
console.log('end of script');
此时,Javascript的执行返回到其事件循环,它找到我们之前注册的.then()
,并执行相关的功能((value) => console.log(value)
)。
有一篇有用的文章描述了事件循环如何与promises一起使用:https://blog.sessionstack.com/how-javascript-works-event-loop-and-the-rise-of-async-programming-5-ways-to-better-coding-with-2f077c4438b5
答案 3 :(得分:2)
但是在执行的哪个阶段变得异步?
当某些事情发生“乱序”时。
Promise.resolve()
是否异步?
通常不会。但是,是的,取决于你用它调用它的参数,它有时会安排一个可能的同化物以供日后使用。在你的情况下,传递一个数组,没有任何异步进行。
在任何情况下,它总是立即返回一个承诺。
或
.then
是异步还是两种功能?
是。 then
总是安排您稍后传入的回调函数。
当然,它也会立即回复承诺。
一般来说,我们可以说观察一个promise结果总是异步的。
当询问函数是否是异步时,遗憾的是我们是否意味着函数是异步调用(稍后),或者导致异步调用另一个函数(通过安排异步事件。)