2017-08-31 62 views
3

我有一個async.each迭代一個數組,併爲數組內的每個元素執行一個函數「檢查」,其中有一個請求。這是代碼,但是當我運行它時,我從調試器看到該節點不執行檢查功能,並且阻止其執行。如何強制使用nodejs執行async.each內部的請求?

async.each(array, 
    function(v_page, callback){ 
    if(v_page.url.length>=5){ 
     internals.check(v_page.url,array2, function (body) { 
     callback(); 
     }); 
    } 
    }, 
    function(err){ 
    internals.calls(var1,var2,var3); 
}); 

我試圖用一個正常的循環,但它在internals.calls功能跳不執行internals.check功能節點的異步性質。那麼我如何強制執行檢查功能呢?

這是檢查功能的代碼:

internals.check = (url,array2,cb) => { 
    request(url, function(err, recordset) { 
    if(err){ 
     cb(array2); 
    }else { 
     //some stuffs 
     cb(array2) 
    } 
    }); 
}; 

回答

4

你叫callback只有當v_page.url.length >= 5,但你需要做的是爲每個元素:

async.each(array, function(v_page, callback) { 
if(v_page.url.length >= 5) { 
    internals.check(v_page.url,array2, function(body) { 
    callback(); 
    }); 
} else { 
    callback(); <== call callback here, when condition is not met 
} 
... 

的另一個問題是,你在internals.check中錯誤地調用回調。根據Node.js表示法,回調的第一個參數必須是錯誤或null(異步使用此表示法)。但是,在你的情況,你叫回調與array2反正:

internals.check = (url, array2, cb) => { 
    request(url, function(err, recordset) { 
    if (err) { 
     cb(err); // <== pass error here 
    } else { 
     cb(null, array2); // <== no error, so first parameter is null, the second is data 
    } 
    }); 
}; 
+0

謝謝,我加了,但沒有任何改變,首先我沒有解決的問題......它不執行檢查功能。 –

+0

更新了答案,您在'internals.check'函數中有一個錯誤。 – alexmac

+0

好的我修復了回調錯誤,但是從調試器中我看到它進入了檢查函數內部,並且當它到達請求時,它跳轉到函數的末尾,所以它看不到回調cb。我認爲這是問題。 –