2015-12-04 30 views
0

我有一個人員列表,每個列表包含一個圖像URL列表。
我需要下載每個URL,然後計算該圖像的'簽名',驗證它是否唯一,然後將其保存到文件系統。
我目前的做法是:兩個嵌套async.each調用,和一個async.waterfall檢查並保存圖像(爲簡單起見,省略錯誤處理):var async = require('async'); var request = require('request');node.js:將異步函數列表應用於列表中的每個項目

var syncPersonsImages = function(persons, images, callback) { 
    async.each(
    persons, 
    function(person, callbackPerson) { 
     async.each(
     person.imageUrls, 
     function(imageUrl, callbackImage) { 
      download(imageUrl, function(err, image) { 
      downloadPost(callbackImage); 
      }); 
     }, 
     function(err) { 
      callbackPerson(); 
     } 
    ); 
    }, 
    function(err) { 
     callback(null, persons); 
    } 
); 

    function download() { 
    request(
     { uri: image.url }, 
     function(err) { 
     callback(err, image); 
     }, 
     function(contents, res) { 
     image.contents = res.contents; 
     callback(null, image); 
     } 
    ); 
    } 

    function downloadPost(image, callback) { 
    async.waterfall(
     [ 
     getSignatureFromImage, 
     findSimilarSignatureImage, 
     saveImage, 
     ], 
     function (err, image) { 
     callback(image); 
     } 
    ); 
    } 

    function getSignatureFromImage(image, callback) { 
    image.signature = crypto.createHash('md5').update(image.url).digest('hex'); 
    callback(null, image); 
    } 

    function findSimilarSignatureImage(image, callback) { 
    if (existsAlready(image.signature)) { // this function is not shown but it's behaviour is clear... 
     image.isNew = true; 
    } 
    callback(null); 
    } 

    function save(image, callback) { 
    if (image.isNew) { 
     img.save(function(err) { 
     console.log('image', image.url, 'saved'); 
     callback(null, image); 
     } 
    } else { 
     callback(null, null); 
    } 
    } 

}; 

的問題是syncPersonsImages方法永遠不會終止...
什麼建議嗎?
我的方法至少是否正確?

+0

哪裏定義了'download'? –

+0

@Mike Atkins:是的,對不起,忘了它...但代碼的目的是作爲'僞代碼',而不是真正的代碼...然而,你是對的...我要完全重寫這個問題與真實的工作代碼......我更感興趣的是瞭解所提交的流程是非常正確的...... – MarcoS

回答

1

總體而言,我認爲這種方法是合理的。幾點。我認爲你已經不必要地包裹了你的一些回調。例如,這樣的:這取決於你是否希望你的async.each要求保釋第一次出現錯誤

function(person, callbackPerson) { 
    async.each(
    person.imageUrls, 
    function(imageUrl, callbackImage) { 
     download(imageUrl, function(err, image) { 
     downloadPost(callbackImage); 
     }); 
    }, callbackPerson); 
}, callback); 

...:

function(person, callbackPerson) { 
    async.each(
     person.imageUrls, 
     function(imageUrl, callbackImage) { 
     download(imageUrl, function(err, image) { 
      downloadPost(callbackImage); 
     }); 
     }, 
     function(err) { 
     callbackPerson(); 
     } 
    ); 
    }, 
    function(err) { 
    callback(null, persons); 
    } 
); 

可以改成。

另外,您還定義了不帶參數的下載方法。

相關問題