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