为什么我的代码阻塞了

时间:2018-02-20 19:39:14

标签: node.js

您好我正在学习node.js中的异步函数但我不明白为什么我的代码阻塞即使我使用回调。 这是我的代码。

function isPerfectNumber(num, callback) {
var sum = 0;

for( var i = 1; i<=(num/2); i++ )
    if( num%i == 0 ) {
        sum += i;
    }
    if( sum == num ) {
        callback(num);
    }
}

exports.getNPerfectNumbers = function(n) {
var count = 0;
var i = 1;
while(count<n) {
    isPerfectNumber(i, function(result) {
        console.log(result);
        count++;
    });
    i++;
}
}

1 个答案:

答案 0 :(得分:0)

以下是异步处理与JavaScript协同工作的方式:

JavaScript将立即执行其当前堆栈上的所有指令。其中一些说明可能会将代码放入JavaScript的event loop(例如,setTimeout函数)。一旦JavaScript完成在当前堆栈上执行其所有指令,它就会检查事件循环以查看是否有任何内容正在等待执行。

了解event loop,您可能会回答自己的问题。

为什么回调可以同步:

正如@KevinB所说,仅仅因为你使用回调并不意味着它是异步执行的。 JavaScript是一种灵活的语言,允许您编写代码imperatively or declaratively(允许使用functional programming范例),这是由于JavaScript函数是第一类对象。