2017-10-06 12 views
0

私は非同期のforEach関数を構築しようとしていますが、残念ながら私が期待していた配列の内容の代わりに値undefinedを返します。私は間違って何をしていますか?非同期forEach関数は未定義を返します

function asyncforEach(array, cb) { 
    array.forEach(function(){ 
     setTimeout(cb, 0); 
    }); 
} 

asyncforEach([1,2,3,4], function(i) { 
    console.log(i) 
}); 
+0

あなたは、アレイから何かをログに記録されることを期待するのはなぜ? 'i'は' cb'に引数を渡していないので 'undefined 'です。 – Xufox

答えて

3

setTimeoutに、コールバックに可変(value)を渡します。

function asyncforEach(array, cb) { 
 
    array.forEach(function(value){ // value: The current array entry 
 
    setTimeout(cb, 0, value); // Pass it to the callback when setTimeout invokes it. 
 
    }); 
 
} 
 
    
 
asyncforEach([1,2,3,4], function(i) { 
 
    console.log(i) 
 
});

functiondelayパラメータの後setTimeoutに渡されたパラメータは、コールバックに渡されます。

var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]); 
2

あなたはforEach関数パラメータにitemを取得し、それに渡された配列の項目にcb関数を呼び出すまた、setTimeoutにアイテムを渡すために逃しました。これにより、時間が経過すると矢印機能内でcb関数が呼び出されます。

function asyncforEach(array, cb) { 
 
    array.forEach(function(i) { 
 
     //-----------------^--- 
 
     setTimeout(() => cb(i), 0); 
 
     //----------^^^^^^^^^^^---- 
 
    }); 
 
} 
 

 
asyncforEach([1,2,3,4], function(i) { 
 
    console.log(i) 
 
});

+0

説明downvote –

+0

ありがとう! Thtは意味をなさない –

+0

そこに矢印機能を追加する必要はありません。 – Cerbrus

関連する問題