gpt4 book ai didi

node.js - 如何在不阻塞的情况下在javascript中执行for循环

转载 作者:搜寻专家 更新时间:2023-10-31 23:38:59 24 4
gpt4 key购买 nike

我有以下脚本

var email_list = ['email1@email.com', 'email2@email.com',....'email100@email.com'];
for(i=0;i<email_list.length;i++){
if(checkEmail(email_list[i])){
//do processing save in db and email to email addresses.
}
}

这段代码在nodejs中会阻塞,如何让它成为非阻塞的?

最佳答案

通过使用递归循环,您可以在完全不阻塞事件循环的情况下执行此操作。这样你最终得到的只是在给定时间每次调用启动一个数据库 worker 。假设您正在做的数据库工作是异步的,您的代码并没有真正阻塞事件循环。但是 foor 循环仍然同时启动了一堆 worker,这往往会阻塞事件循环(而不是阻止它)。你是对的,因为当你的 for 循环从 0 计数到数组的大小时,它阻塞了事件循环。下面的代码做同样的事情,但是你一次只启动一个数据库 worker (很好),而且你从不从 0 数到长度。在当前电子邮件的工作完成后,每个工作人员都会从列表中弹出,并且您的全局事件循环将被留下来处理其他事情,而不是同时处理 email_list.length 数据库请求。

var email_list = ['email1@email.com', 'email2@email.com', 'email100@email.com'];


function checkEmailList(emails, emailCallBack, completionCallback) {

var someDataCollectdOverAllEmails = '';

function checkEmailAsync(email) {
db.doSomeDBWorkAsync(email, function (data) {

someDataCollectdOverAllEmails += data;

if (email_list.length) {
checkEmail(email_list.pop()); //If there are still emails to be checked, check the next one ine line
} else {
completionCallback(someDataCollectdOverAllEmails);//IF not, call the completionCallBack
}

emailCallBack(data);
});
}

checkEmailAsync(emails.pop());
}

function logIndividualEmailData(data) {
console.log('Sningle Email: ' + data);
}

function logGlobalEmailData(data) {
console.log('All Email Data: ' + data);
}

checkEmailList(email_list, logIndividualEmailData, logGlobalEmailData);

Process.nextTick 示例

process.nextTick(function () {
'use strict';
console.log('printed second');
while (true);
});

process.nextTick(function () {
'use strict';
console.log('never printed');
});

console.log('printed first');

但是请注意,在下面的示例中,尽管 loopForever 将永远运行,但它仍然允许我们读取两个文件。如果我们只有 while(true) 它当然会阻止并且不允许这样做,并且我们的文件数据之一将不会被打印出来。

var files = ['blah.js', 'file.js'];
for(var i = 0; i < files.length; i++) {
fs.readFile(files[i], function (err, data) {
console.log('File data' + data);

function loopForver(loop) {//asynchronously loop forever, pretty cool, but only useful for really specific situations!
process.nextTick(function () {
if(loop) {
console.log('looping');
loopForver(true);
}
});
}
loopForver(true);
});
}

关于node.js - 如何在不阻塞的情况下在javascript中执行for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17992483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com