Javascript Promise.resolve是异步函数吗?
当我有以下代码时:Javascript Promise.resolve是异步函数吗?,javascript,node.js,asynchronous,callback,promise,Javascript,Node.js,Asynchronous,Callback,Promise,当我有以下代码时: var promise1=Promise.resolve([1,2,3]); 承诺1.然后((价值)=>{ console.log(值); //预期输出:数组[1,2,3] }); log(“脚本结束”) Promise.resolve()是异步的吗 不,这只是一个常规的函数调用。它将立即返回结果 然后是异步的,甚至是两个函数 不,两者都不是异步的,因为 promise1.then((value) => console.log(value)); 将立即返回链接的新承
var promise1=Promise.resolve([1,2,3]);
承诺1.然后((价值)=>{
console.log(值);
//预期输出:数组[1,2,3]
});
log(“脚本结束”)代码>
Promise.resolve()是异步的吗
不,这只是一个常规的函数调用。它将立即返回结果
然后是异步的,甚至是两个函数
不,两者都不是异步的,因为
promise1.then((value) => console.log(value));
将立即返回链接的新承诺
但是,Promise肯定是异步解析的,这意味着内部函数(value=>console.log(value)
)在整个同步代码执行之后肯定会被调用
引擎盖下还有其他装置吗
是的,后台有一个“魔术”事件循环,它管理所有异步事件
但在什么执行点它会变得异步呢
当事情发生“不正常”时
Promise.resolve()
是异步的吗
通常不会。但是,是的,根据你称之为它的论点,它有时确实会为以后安排一个表格的同化。在您的情况下,传递一个数组时,没有任何异步操作
无论如何,它总是立即返回一个承诺
或者是。那么是异步的,甚至是两种功能
对then
总是安排您稍后传入的回调函数
当然,它也总是会立即做出承诺
一般来说,我们可以说遵守承诺结果总是异步的
当询问函数是否为异步函数时,不幸的是,我们的意思是异步调用函数(稍后),还是导致异步调用另一个函数(通过安排异步事件)。下面是具体的操作顺序。在开始之前,您应该注意Promise对象始终处于以下三种状态之一:
等待评估完成
用最终值解析
使用“原因”值拒绝
首先,promise1
被分配一个处于“已解决”状态的承诺,其最终值为[1,2,3]:
var promise1 = Promise.resolve([1, 2, 3]);
接下来,我们要求,一旦promise1
进入解析状态,我们就记录它的最终值但是,承诺中的.then()、.catch()等在整个程序通过并执行进入Javascript事件循环之前不会进行计算。因此,这段代码注册了将来要完成的操作,但实际上并没有完成它;这段代码会立即返回,但不会完成
promise1.then((value) => {
console.log(value);
// expected output: Array [1, 2, 3]
});
然后,我们打印一些文本:
console.log('end of script');
此时,Javascript的执行返回到它的事件循环,它找到我们之前注册的.then()
,并执行相关函数((value)=>console.log(value)
)
这里有一篇有用的文章描述了事件循环如何与承诺一起工作:所有答案都很好,但我想在这里提到一点微妙之处。在JS中,并非所有异步动物都是平等的。承诺使用微任务队列,而oldschool异步回调使用事件队列
因此,对于下面的代码,请在运行之前尝试猜测日志的顺序
console.log(“代码从这里开始”);
setTimeout(console.log,0,“setTimeout已解决”);
承诺。解决(“承诺已解决”)
。然后(s=>(console.log),“又一个承诺已解决”))
。然后(s=>console.log);
log(“代码到此结束”)
解析和调用回调是两件不同的事情。我认为在Promise.resolve([1,2,3])
中,承诺是同步实现的(已解决)。即使在承诺执行器中调用resolve
函数也是同步的,它会立即更改承诺状态。@bergi with resolves我指的是调用的回调,而不是resolve()
。。。但是我承认我的声明允许解释…是的,通常意味着“将承诺的状态设置为已解决”。这可能会有所帮助:我认为您的代码不会演示这个“微任务队列”(如果存在)setTimeout(0)
在大约4ms后激发,因此无论有多个队列,该事件都将持续激发。
console.log('end of script');