2015-12-02 139 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

相關問題