Javascript 在引擎盖下执行异步代码,如承诺

Javascript 在引擎盖下执行异步代码,如承诺,javascript,node.js,Javascript,Node.js,Node.js(以及通常的JavaScript)是如何实现异步代码的执行的,比如幕后承诺?它运行新线程吗?它是使用Worker还是有一些操作系统或libuv功能 var promise1 = new Promise(function(resolve, reject) { let now = new Date(); while((now - 6000) < start){ now = new Date(); } resolve(now -

Node.js(以及通常的JavaScript)是如何实现异步代码的执行的,比如幕后承诺?它运行新线程吗?它是使用Worker还是有一些操作系统或libuv功能

var promise1 = new Promise(function(resolve, reject) { 
    let now = new Date(); 
    while((now - 6000) < start){
        now = new Date();
    }
    resolve(now - start)
});

var promise2 = new Promise(function(resolve, reject) { 
    let now = new Date(); 
    while((now - 6000) < start){
        now = new Date();
    }
    resolve(now - start)
});
let start = new Date(); 
promise1.then(
    function(value) {
      console.log("Promise 1: ", value);
    }
)

promise2.then(
    function(value) {
      let finish = new Date();
      console.log("Promise 2: ", value);
      console.log(finish - start);
    }
)
var promise1=新承诺(函数(解析、拒绝){
让我们现在=新日期();
而((现在-6000)<开始){
现在=新日期();
}
解决(现在-开始)
});
var promise2=新承诺(函数(解析、拒绝){
让我们现在=新日期();
而((现在-6000)<开始){
现在=新日期();
}
解决(现在-开始)
});
开始=新日期();
承诺1.那么(
函数(值){
console.log(“承诺1:”,值);
}
)
承诺2.那么(
函数(值){
让finish=新日期();
console.log(“承诺2:”,值);
console.log(完成-启动);
}
)

承诺在Node.js中不是异步的。但是有一个新特性—异步工作程序。它在一个单独的进程中运行。所以你可以使用它,这里有更多的信息:

他们使用事件循环——简而言之,JavaScript是一个同步的、运行到完成的单线程运行时。因此,没有新线程用于异步行为。只有当一个新任务(或微任务)被放入堆栈时,它才能执行。异步任务在将来的某个时候被放到堆栈上。@ParvSharma-提供了答案。异步任务排队(在堆上),等待堆栈清除。一旦堆栈清除,队列就被放置到堆栈上,这些任务将一直运行到完成。线程之间不存在争用,因此技术上不可能存在“阻塞”。排队的任务被放入堆栈时会有延迟,这“感觉”像是阻塞,而实际上不是阻塞。它只是等待单个线程。@DmytroHuz承诺不会“运行”,它们只是表示结果的对象。诸如超时、网络请求、io等实际异步内容是由与承诺无关的特定函数启动的,异步任务的执行方式(libuv、线程等)取决于特定任务是什么。异步/等待代码就像普通的
然后
回调一样,它与所有其他js代码运行在同一个主循环中。构造函数回调被同步调用,并在其中无条件地同步解析。也就是说,他们没有做任何异步的事情。第一个函数运行6秒钟,并以值6000进行解析,然后在第一个函数解析后,第二个函数启动,并且根本不需要循环,因为自从
start
被分配了一个值以来,已经过了6秒钟。如果在创建第二个承诺之前重置start,则代码运行时间将为12秒,而不是6秒(但两者仍将输出6000)。