2017-08-31 19 views
3

私は配列を反復するasync.eachを持っていて、配列内のすべての要素に対して内部で要求を持つ関数 "check"を実行します。これはコードですが、実行すると、ノードがチェック機能を実行せず、実行をブロックすることがデバッガからわかります。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); 
}); 

Iループの通常と試みたが、それは、ノードの非同期性質をinternals.check機能を実行することなくinternals.calls関数にジャンプ。だから私はどのようにチェック機能の実行を強制することができますか?

これは、チェック機能のコードです:

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

答えて

4

あなただけv_page.url.length >= 5callbackを呼び出していますが、各要素のことを実行する必要があります。

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でなければなりません(asyncはこの表記を使用します)。しかし、あなたの場合には、あなたはとにかく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

ok私はコールバックのバグを修正しましたが、デバッガからはチェック関数の中に入ることがわかりました。要求に達すると関数の最後にジャンプし、コールバックcbは表示されません。私はこれが問題だと思います。 –

関連する問題