2016-10-25 17 views
1

私は一連のチェーンでうまく動作しているチェーン可能な約束事を持っていますが、今度はforループのseriosをforループと呼んでいますが、期待通りに機能しません。forループ内の約束が正しく実行されない

私のdemo plunkerを参照し、コンソールの出力を参照してください。

以下は私の連鎖約束の構造です。私はすべてpublicIPを返します。これはfunTwoによって返されます。私はfunThree()を完了し、すべてを取得したいpublicIP。私は$q.when()が約束オブジェクトの値を作ることを知っています。

これまでにconsole.log('res three');と実行されていたconsole.log('pA', promiseArray);と、それ以前にsuccessHandlerfinallyが呼ばれていたことが分かります。ここで

は確かに私は、適切な場所でreturn;を記述する必要が親切forループ内のすべての機能を実行する方法を私を助けるとsuccessHandler

に再試行することができ、ループ終了のため、その後のデータ配列を返すことも、何かが欠けています
MyService.funZero() 
    .then(function(response) { 
     console.log(response); 
     var promiseArray = []; 
     for(var i = 0; i < 2 ; i++) { 
      console.log('I', i); 
      MyService.funOne() 
      .then(MyService.funTwo) 
      .then(function(res2) { 
       console.log('res two', res2); 
       publicIP = res2.ip; 
       console.log('i', publicIP); 
       promiseArray.push({'ip': publicIP}); 
       return MyService.funThree(publicIP); 
      }) 
      .then(function() { 
       console.log('res three'); 
      }) 
      } // for loop ends 
     console.log('pA', promiseArray); 
     return $q.when(promiseArray); 
     }) 
     .then(function(res4){ 
      console.log('after for loop', res4); 
     }) 
     .then(successHandler) 
     .catch(errorHandler) 
     .finally(final, notify); 
+0

[ループ内のJavaScriptの閉鎖 - シンプルな実用的な例]の可能な重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-実用的な例) – Phil

+0

これは重複していません@Phil ..私はすでにこれを読んでいますが、angularJSでの適用方法はありませんでした。 –

+0

あなたは正しいです、私の謝罪。 – Phil

答えて

2

だから、私はMyService.funThreeがまったく同じかわからないんだけど、あなたはipArray.push({'ip': publicIP})を経由して、アレイを集約し、その後MyService.funThreeとその後の機能にそれを返すことができます。ここの問題は、それがあなたが探しているものなら、ipArrayに注文の保証はありません。ここでは、その関数の中央部分があります:

ipArray = []; 
for(var i = 0; i < 2 ; i++) { 
    console.log('I', i); 
    var promise = MyService.funOne() 
    .then(MyService.funTwo) 
    .then(function(res2) { 
     console.log('res two', res2); 
     publicIP = res2.ip; 
     console.log('i', publicIP); 
     ipArray.push({'ip': publicIP}); 
     return ipArray; 
    }) 
    .then(MyService.funThree) 
    .then(function() { 
     console.log('res three'); 
    }); 

    promiseArray.push(promise); 
} 
console.log('pA', promiseArray); 
return $q.all(promiseArray); 
+0

貴重なご意見ありがとうございます。私の状況では 'MyService.funThree()'は 'res2'のデータを使用しています。したがって、funThreeを次の '.then()'に置き換えることはできません。 –

+0

ここで 'ipArray'を返すのではなく、' res2'を返して、 'MyService.funThree'の引数として渡すことができます。 –

関連する問題