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*/);
    });
  });
});