Javascript Promise在node js中是同步的还是异步的

Javascript Promise在node js中是同步的还是异步的,javascript,node.js,asynchronous,promise,synchronous,Javascript,Node.js,Asynchronous,Promise,Synchronous,我对承诺有很多困惑。它是同步的还是异步的 return new Promise (function(resolved,reject){ //sync or async? }); 传递给Promise构造函数的函数是同步运行的,但是任何依赖于其解析的函数都将被异步调用。即使承诺立即解决,任何处理程序都将异步执行(类似于当您setTimeout(fn,0)时)-主线程首先运行到末尾 无论您的Javascript环境是节点还是浏览器,这都是正确的 console.log('start')

我对承诺有很多困惑。它是同步的还是异步的

return new Promise (function(resolved,reject){
    //sync or async? 
});
传递给Promise构造函数的函数是同步运行的,但是任何依赖于其解析的函数都将被异步调用。即使承诺立即解决,任何处理程序都将异步执行(类似于当您
setTimeout(fn,0)
时)-主线程首先运行到末尾

无论您的Javascript环境是节点还是浏览器,这都是正确的

console.log('start');
const myProm=新承诺(函数(解析、拒绝){
console.log('running');
解决();
});
然后(()=>console.log('resolved');

控制台日志(“主块的末尾”)承诺本身并不完全同步或异步。当您创建一个承诺时,您传递给它的回调将立即执行,并且在该函数产生之前,其他代码都不能运行。考虑下面的例子:

新承诺(功能(解析、拒绝){
console.log('foo');
})

console.log('bar')当您创建一个承诺并向其回传一个呼叫时 该回调将立即执行(同步)

const promise=新承诺(函数(解析、拒绝){
//做一些逻辑,它会同步执行
控制台日志(“结果”);
})
console.log(“全局日志”)

承诺类似于Javascript中的普通类。假设您正在创建自己的Promise实现,Promise类大致如下所示。请注意,在构造函数中,您希望传递一个方法,并立即调用该方法作为参数传递
resolve和reject

class Promise {
    constructor(method) {
        method(resolve, reject)
    }

    resolve() { ... }

    reject() { ... }

    then() { ... }
}
因此,当您执行
newpromise()
时,您只是在创建一个新对象。您的
Promise构造函数将运行,它将立即调用该方法。这就是为什么承诺中的代码会同步执行

return new Promise (function(resolved,reject){
    //sync or async? 
});
如果在函数内部调用另一个本质上是异步的函数,那么另一个函数将异步执行,否则,其他所有函数都将同步执行

return new Promise (function(resolved,reject){
    //sync or async? 
});
如果在promise中使用
then
,则只有在第一个promise调用了
resolve()
之后,才会调用它


该代码使其更加清晰:

        console.log("0");
        new Promise((resolve, reject) => {
          console.log("1");
          resolve();
        }).then(() => {
          console.log("2");
        });
        console.log("3");
代码打印:
0132
因此,
然后
异步运行,而主回调函数同步运行。

return new Promise (function(resolved,reject){
    //sync or async? 
});
const promise=新承诺(函数(解析、拒绝){
//做一些逻辑,它会同步执行
控制台日志(“检查”)
解决(“完整归档”)
})
承诺。然后(v=>{
控制台日志(v)
})

log(“全局日志”)
但根据Mozilla站点,您传入的函数是异步的。请参阅以“通常情况下,其工作原理如下:tetherFunction内的操作…”开头的段落。这是指通常的方法,在这种情况下,在
tetherFunction
中调用一个异步的、基于回调的函数,当回调运行时,调用
resolve
。很好!你可能想把它放在你的答案中,因为这让很多人感到困惑。同步意味着代码只能在上一个任务/代码行完成后运行。异步意味着两段代码可以并行运行。承诺外的代码不必等待承诺内的代码完成,除非您使用wait语法等待它,它将异步转换为同步。但是,从示例中可以看出,承诺外的代码实际上是等待承诺内的代码在执行之前产生。承诺本身并不是异步的,它们只是一种表示可能由异步过程生成的价值的方式。当然,这很公平。我仍然觉得这句话很难理解“依赖于该值的逻辑可以异步等待”。我认为这个值是同步等待的——这正是sync的意思,在其他代码完成之前,代码无法执行。