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');