2016-11-10 2 views
1

の反復ごとに、私はこのようなロック機能があります。待ち()だから、ループ

function getMainData() { 
    var dfd = $.Deferred(); 

    $.getJSON('My string that i pass', 
     function(result) { 
      if (result !== undefined) { 
       dfd.resolve(result); 
      } 
     }) 

    return dfd.promise() 
} 

function getSpecificData() { 
    var dfd = $.Deferred(); 

    var myArray = []; 

    for (var i = 0; i < 5; i++) { 
     getMainData().done(function(result) { 
      myArray.push(result) 

      dfd.resolve(myArray) //This is where I am lost. 
     }) 
    } 

    return dfd.promise() 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}) 

を、私はあなたがそれらを一緒に連鎖場合、私は約束はどのように機能するかを知っていると思うが、私は作ることができませんforループは、非同期呼び出しが次の反復の前に終了するのを待つ。

いくつかお手伝いできますか?

var myArray = []; 
var cpt=0; 
var total=5; 

getMainData(); 
console.log(myArray); 

function getMainData() 
{ 
    $.getJSON('My string that i pass', function(result) { 
     if(cpt<total) 
     { 
      myArray.push(result); 
      cpt++; 

      getMainData(); 
     } 
    }) 
} 

・ホープ、このことができます:

答えて

2

forループには、非同期コードを待つ次の反復を遅延させる手段がありません。

あなたは素敵なソリューションの代わりに

function getMainData() { 
    return $.getJSON('My string that i pass'); 
} 

function getSpecificData() { 
    var myArray = [], def = new $.Deferred(); 

    (function rec(i) { 
     getMainData().done(function(result) { 
      myArray.push(result); 
      if (i < 5 && result !== undefined) { 
       console.log(i) 
       rec(++i); 
      } else { 
       def.resolve(myArray); 
      } 
     }); 
    })(0); 

    return def.promise(); 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}); 
+0

解決策をお寄せいただきありがとうございます。これはうまくいきました。再帰的メソッドについては実際考えていませんでした。 – Zorken17

0

はあなたのようなpromiseずにしようとしています。

1

代わりに、すべての約束事を配列にプッシュし、すべてが終了するのを待つべきです。

function getMainData() { 
    return $.getJSON('My string that i pass'); 
} 

function getSpecificData() { 
    var promiseArray = []; 

    for (var i = 0; i < 5; i++) { 
     promiseArray.push(getMainData()); 
    } 

    return $.when.apply($, promiseArray); 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}) 
+0

おかげで再帰的に呼び出される関数を使って、それを解決することができますが、意図したとおり、これは動作しません。私はすべての非同期呼び出しから値を取得していません。これは、ループが非同期呼び出しを待っていないことを意味します。 – Zorken17

+0

@ Zorken17引数変数を使用して、結果変数の代わりに完全な戻り値リストを取得することができます –