Javascript 如何了解节点js的同步和异步行为

Javascript 如何了解节点js的同步和异步行为,javascript,node.js,Javascript,Node.js,我试图理解node.js的异步行为 let a = (num, callback) => { for (let i = 0; i<num; i++) { console.log(i); } callback(num); } a(10000, (num) => { console.log("num is " + num) }) console.log("Completed") 请您帮助我理解为什么在打印9999之前它一直处于

我试图理解node.js的异步行为

let a = (num, callback) => {
    for (let i = 0; i<num; i++) {
        console.log(i);
    }

    callback(num);
}

a(10000, (num) => {
    console.log("num is " + num)
})

console.log("Completed")

请您帮助我理解为什么在打印9999之前它一直处于阻塞状态,以及节点在什么条件下表现为同步和异步…?

实际上发生的事情是您没有实际使用异步代码。这是一个使用承诺和异步函数可能尝试实现的示例:

// Uses promises to delay
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function AsyncOperations() {
  // We are waiting one second before calculating
  await delay(1000);
  let sum = 0;
  for (let i = 0; i < 1000; ++i) {
    sum += i;
  }
  console.log(sum);
  return sum;
}

function sumPrint() {
  // Async function will run then when its finished, we will print result
  AsyncOperations().then((result) => console.log('We got: ' + result));
  // Print 'Welcome' before AsyncOperations has finished
  console.log('Welcome');
}

sumPrint();
/* Outputs:

Welcome
499500
We got: 499500
*/
//使用承诺来延迟
功能延迟(毫秒){
返回新承诺((resolve)=>setTimeout(resolve,ms));
}
异步函数AsyncOperations(){
//我们等了一秒钟才开始计算
等待延迟(1000);
设和=0;
对于(设i=0;i<1000;++i){
总和+=i;
}
控制台日志(总和);
回报金额;
}
函数sumPrint(){
//异步函数将运行,然后当它完成时,我们将打印结果
AsyncOperations()。然后((result)=>console.log('We-get:'+result));
//在异步操作完成之前打印“欢迎”
console.log('Welcome');
}
sumPrint();
/*产出:
欢迎
499500
我们有:499500
*/

您提供的代码段不包含任何异步代码。与前面提到的另一个用户一样,for循环是一个同步代码块,一旦启动,将运行到完成。循环并不是你所说的异步意义上的“阻塞”,它只是在做它应该做的事情。 为了进一步了解预期行为,我建议查看JS承诺(使用async和await)和“并发模型和事件循环”


希望这有帮助

此代码只是100%同步。 它在一个滴答声中运行

如果希望此代码异步运行,可以这样编写,例如:

const NEXT\u TICK=0;
设a=(num,callback)=>{
for(设i=0;i回调(num),下一个_勾选);
}
a(10000,(num)=>{
log(“num是”+num)
})

console.log(“Completed”)
这一切都不是异步的。它按顺序打印,因为
for
循环是同步的。一旦for循环完成,它就会同步地调用回调。更大的问题是,为什么你认为这一切都是异步的?我猜这种混淆源于回调的使用,回调是与异步代码交互的一种方式,但这并不意味着代码实际上是异步的。您期望的是什么行为?问题有点悬而未决,建议您阅读本文这只是延迟变更单的执行,但不解释它
// Uses promises to delay
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function AsyncOperations() {
  // We are waiting one second before calculating
  await delay(1000);
  let sum = 0;
  for (let i = 0; i < 1000; ++i) {
    sum += i;
  }
  console.log(sum);
  return sum;
}

function sumPrint() {
  // Async function will run then when its finished, we will print result
  AsyncOperations().then((result) => console.log('We got: ' + result));
  // Print 'Welcome' before AsyncOperations has finished
  console.log('Welcome');
}

sumPrint();
/* Outputs:

Welcome
499500
We got: 499500
*/