2017-11-12 5 views
1

以下に2つの機能があります。戻り値の1つは約束であり、私はそれぞれのループで最初に終了してからそれを待つことを望みます。下に示すように、結果は望ましい/同期ではありません。私は使うべきではありませんasync.forEachofループを継続した後、それぞれの約束を待つ

function test(num, callback) 
{ 
    console.log("inside function: "+num) 
    return new Promise((resolve, reject) => { 
     my.promise(num).then(() => { 
      console.log("done: "+num) 
      resolve(callback); 
     }).catch(e => console.error(e)); 
    }).catch(console.error); 
} 

function start_function() 
{ 
    //stuff 
    async.forEachOf(arr, function (itm, i, callback){ 
     console.log(i) 
     test(i, callback).catch(e => console.error(e)); 
    }, function (err) { 
     console.log("ALL DONE") 
    }); 
} 

結果:私はいけないが、私は必要があるため、それぞれが前の1の結果を待ち、その後、開始することを約束していないので、PromiseAllを使用したくない

0 
inside function 0 
1 
inside function 1 
2 
inside function 2 
done: 0 
done: 2 //wrong should always be 1, finished before the previous promise. 
done: 1 //wrong 
ALL DONE 

次のもの。それゆえ、それらをすべて集めて、どんな順序で、そして私がする必要があるかでそれらが完了するのを待つことは無意味です。

答えて

1

あなたが何をしようとしているのか間違っていない場合は、プロミス関数でコールバックを渡してそれを解決しないでください。このコードで同じことを達成し、テスト関数からコールバックを削除することもできます。

function start_function() 
{ 
    //stuff 
    arr.forEach(async function (itm, i, array){ 
     console.log(i) 
     try { 
      await test(i); 
     } 
     catch(err){ 
      console.log(err); 
     } 
    }); 
} 

はここで、テスト関数は次のように見えるかもしれ方法です。このアプローチについて

function test(num) 
{ 
    console.log("inside function: "+num) 
    return new Promise((resolve, reject) => { 
     my.promise(num).then(() => { 
      console.log("done: "+num) 
      resolve(); 
     }).catch(e => { 
       console.error(e) 
       reject(e); 
     }); 
    }); 
} 
+0

までloopOnItemsメソッドを呼び出す

(function loopOnItems(i) { dummyGoogleAPI.someAsyncMethod(data).then(function (_response) { // do something with response }) .catch(function (error) { console.error(error); }); if (--i){ loopOnItems(i); }// decrement i and call loopOnItems again if i > 0 else{ _callback(errors); } })(count); 

私はそれを実行している場所を待つ使用を傾ける。それは間違っていない限り、最新の安定したものではありません。 –

+0

あなたはどのノードのバージョンを使用していますか?それはnode.js 7.6.x –

+0

の後にあるはずです.8の恥ずかしがり屋です.LTSは8.9です。 –

1

何を:あなたは、いくつかのcountを持っていると我々は数> 0

+0

このアプローチは良いと思われます。その理由は;いろいろな理由から、私は待ち時間を避けるため、再帰は避けたい。 –

関連する問題