Javascript nodejs:如何等待几个异步任务完成
我有一个我正在写东西的文件:Javascript nodejs:如何等待几个异步任务完成,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一个我正在写东西的文件: var stream = fs.createWriteStream("my_file.txt"); stream.once('open', function(fd) { names.forEach(function(name){ doSomething(name); }); stream.end(); }); 这是工作正常,我能够写入文件。 问题是doSomething()函数的某些部分是异步的。dnsLookup函数可以给出一个示例。在我的剂
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
names.forEach(function(name){
doSomething(name);
});
stream.end();
});
这是工作正常,我能够写入文件。
问题是doSomething()函数的某些部分是异步的。dnsLookup函数可以给出一个示例。在我的剂量中,我有:
现在,我的问题是,因为DNS检查是异步的,所以代码一直在执行关闭流。当DNS响应最终到来时,它无法写入任何地方。
我已经尝试过使用异步模块,但没有成功。也许我做错了什么
有什么想法吗?既然NodeJS在ES2015功能方面基本上是最快的(我注意到您至少使用了一个arrow函数),您可以使用JavaScript中的本机承诺(以前您可以使用库): (行
Promise.all(names.map(name=>doSomething(name)))
可以是Promise.all(names.map(doSomething))
如果您知道doSomething
忽略额外的参数,只使用第一个参数。)
Promise.all
(|)接受一个iterable并返回一个承诺,该承诺在iterable中的所有承诺都已解决时已解决(非承诺值将被视为已解决承诺,使用该值作为解决方案)
其中,doSomething
变为:
function doSomething(name) {
return new Promise((resolve, reject) => {
dns.lookup(domain, (err, addresses, family) => {
if(!err){ // <== You meant `if (err)` here, right?
stream.write("Error:", err);
reject(/*...reason...*/);
}else{
stream.write(addresses);
resolve(/*...possibly include addresses*/);
});
});
});
函数doSomething(名称){
返回新承诺((解决、拒绝)=>{
dns.lookup(域,(错误、地址、族)=>{
如果(!err){/现在NodeJS在ES2015特性方面基本上是最快的(我注意到您至少使用了一个arrow函数),那么您可以使用JavaScript中的本机承诺(以前您可以使用库):
(行Promise.all(names.map(name=>doSomething(name)))
可以是Promise.all(names.map(doSomething))
如果您知道doSomething
忽略额外的参数,只使用第一个参数。)
Promise.all
(|)接受一个iterable并返回一个承诺,该承诺在iterable中的所有承诺都已解决时已解决(非承诺值将被视为已解决承诺,使用该值作为解决方案)
其中,doSomething
变为:
function doSomething(name) {
return new Promise((resolve, reject) => {
dns.lookup(domain, (err, addresses, family) => {
if(!err){ // <== You meant `if (err)` here, right?
stream.write("Error:", err);
reject(/*...reason...*/);
}else{
stream.write(addresses);
resolve(/*...possibly include addresses*/);
});
});
});
函数doSomething(名称){
返回新承诺((解决、拒绝)=>{
dns.lookup(域,(错误、地址、族)=>{
如果(!err){//承诺存在,可以解决您遇到的问题。我会看一些类似旁注的东西:我相当确定您的意思是if(err)
,而不是if(!err)
上面,因为连接到它的块是用来处理错误的。承诺可以解决您遇到的问题。我会看一些类似于旁注的东西:我很确定您指的是if(err)
而不是if(!err)
上面,因为连接到它的块是用来处理错误的。
function doSomething(name) {
return new Promise((resolve, reject) => {
dns.lookup(domain, (err, addresses, family) => {
if(!err){ // <== You meant `if (err)` here, right?
stream.write("Error:", err);
reject(/*...reason...*/);
}else{
stream.write(addresses);
resolve(/*...possibly include addresses*/);
});
});
});