2015-01-09 76 views
1

在我的nodejs應用(使用sailsjs)中,我使用控制器接收以.zip上傳的多個圖像,然後使用水線將它們保存在我的數據庫中:NodeJS/Waterline,需要在響應前等待多個創建結束

var images = []; 
zipEntries.forEach(function(zipEntry) { 
    zip.extractEntryTo(zipEntry.entryName, p, false, true); 

    Image.create({ 
     filename: zipEntry.name, 
    }).exec(function(err, image){ 
     images.push(image); 
    }); 
}); 
res.json(images); 

問題是我需要發回所有生成的圖像ID(自動遞增),但創建方法是異步的。
在我可以發送服務器響應之前,有什麼方法可以等待所有創建方法結束嗎?

編輯:所以我通過檢查我得到的圖像的數量並在.exec方法中增加一個索引來找到工作,我可以檢查這是否是最後一個可執行文件,然後發送響應。

var images = [], 
    nbValidImage = 0, 
    i = 0; 
zipEntries.forEach(function(zipEntry) { 
    zip.extractEntryTo(zipEntry.entryName, p, false, true); 
    nbValidImage++; 
    Image.create({ 
     filename: zipEntry.name, 
    }).exec(function(err, image){ 
     i++; 
     images.push(image); 
     if(i == nbValidImage) { 
      res.json(images); 
     } 
    }); 
}); 

但如果有人有更好的解決方案... :)

回答

2

在這種情況下,我會去與async.each,因爲zipEntries是一家集(沒有測試此代碼):

var async = require('async'); 

async.each(zipEntries, function (zipEntry, callback) { 
    zip.extractEntryTo(zipEntry.entryName, p, false, true); 

    Image.create({ 
    filename: zipEntry.name 
    }).exec(function (err, image) { 
    images.push(image); 
    callback(); 
    }); 

}, function (err) { 
    if (error) throw new Error(error); 
    res.json(images); 
}); 
+0

是的,我正在閱讀Async文檔,async.each似乎對我來說是最好的解決方案。謝謝:) – Najie

+0

我同意每個會更好。如果您在運行此計算機的計算機上運行內存,則每個限制也很好,您可以限制並行創建的文件數量。 – jlonganecker

2

我會說你要籤承諾或異步。

異步具有並行功能,我覺得在這種情況下很有用。

https://github.com/caolan/async#paralleltasks-callback

它可以讓你在再一次運行多個異步函數時,所有的功能都做了回調被調用。

我認爲它可以完美滿足您的需求。

這裏是他們的文件的例子:

var async = require('async'); 

async.parallel([ 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'one'); 
     }, 200); 
    }, 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'two'); 
     }, 100); 
    } 
], 
// optional callback 
function(err, results){ 
    // the results array will equal ['one','two'] even though 
    // the second function had a shorter timeout. 
}); 
+0

呀我聽說過Async,我正在尋找一個解決方案,而不使用新的庫,但我認爲我很快就會需要這個:) – Najie