2015-12-02 140 views
0

我必须处理需要针对每个文件条目执行异步任务的entries的数组:getFileuploadResult都是异步任务。我的问题是如何知道何时使用asyncjs这样的异步库处理数组doc.entries。下面的代码只是我想要实现的一个例子。确定异步执行何时完成

var doc = { 
    version: '1.7', 
    entries: [{ 
     date: '11/11/10', 
     files: [{ 
      name: 100, 
      executable: false 
     }, 
     { 
      name: 101, 
      executable: false 
     }] 
    }, 
    { 
     date: '11/12/10', 
     files: [{ 
      name: 200, 
      executable: false 
     }, 
     { 
      name: 201, 
      executable: false 
     }] 
    }, 
    { 
     date: '11/13/10', 
     files: [{ 
      name: 300, 
      executable: false 
     }] 
    }, 
    { 
     date: '11/14/10', 
     files: [{ 
      name: 400, 
      executable: false 
     }] 
    }] 
}; 

doc.entries.map(function(entry){ 

    entry.files.map(function(file){ 

     getFile(file, function(err, result){ 
      if(err){ 
       throw Error(err) 
      } 

      uploadResult(result, function(err, status){ 
       WriteOnDb(file.name, status, function(err, result){ ... }); 
      }); 
     }) 
    }); 
}); 

我怎么知道最后一个文件在db上的存储时间,然后做别的事情?

谢谢。

+0

确实WriteOnDB( )有一个回调参数? – jeff

+0

@jeff是的,它确实l,我只是更新了问题。谢谢。 – Felix

回答

1

最简单的方法是使用的承诺,或更好的观测,但你有回调做到这一点 - 例如,你可以指望有多少任务总共有多少就完成:

var total = doc.entries 
    .map(function (entry) { 
    return entry.files.length; 
    }) 
    .reduce(function (x, acc) { 
    return acc + x 
    }, 0); 

var finished = 0; 

function finishCallback(err) { 
    if (err === null) { 
    /// all async tasks are finished; 
    } 
} 

doc.entries.map(function (entry) { 
    entry.files.map(function (file) { 
    getFile(file, function (err, result) { 
     if (err) { 
     finishCallback(err); 
     } else { 
     uploadResult(result, function (err, status) { 
      WriteOnDb(file.name, status, function (err, result) { 
      if (err) { 
       finishCallback(err); 
      } else { 
       finished += 1; 
       if (finished === total) finishCallback(null); 
      } 
      }); 
     }); 
     } 
    }) 
    }); 
}); 
+0

谢谢,我最终为此使用了异步库。 – Felix

相关问题