2016-04-27 5 views
1

forループを作成して、ライブラリ(jQueryなど)を使用せずにループの新しい繰り返しを開始する前に、非同期呼び出しが完了するのを待つ方法を教えてください。forループをJS内のライブラリなしで作成する

例:

var items = [1,2,3,4,5]; 
 

 
for (var i = 0; i < items.length; i++) { 
 

 
    var promise = new Promise(function(resolve, reject){ 
 
     asyncAPIcall({ 
 
      body : item[i] 
 
     }, function(error, response){ 
 
      if(error) { 
 
       reject(); 
 
      } else { 
 
       resolve(); 
 
      } 
 
     }); 
 

 
    promise.then(function() { 
 
      //continue loop 
 
     }, function() { 
 
      //break loop 
 
     }); 
 

 
}

おかげ


UPDATE(4/29)

私は関数を作成し、この溶液を考えますth通話自体で:

var items = [1,2,3,4,5]; 
 

 
var counter = items.length - 1; //minus one since array is zero based. 
 

 
function myLoop(){ 
 

 
    asyncAPIcall({ 
 
     body : item[counter] 
 
    }, function(error, response){ 
 
     if(error) { 
 
      // Error message. 
 
     } else { 
 
      counter = counter - 1; 
 
      if(counter == -1){ 
 
       //Done 
 
      } 
 
      else { 
 
       myLoop(); 
 
      } 
 
     } 
 
    }); 
 

 
}

+0

できません。あなたは本当に何をする必要がありますか? – Amit

+0

'for'ループは同期しています。非同期操作を待つことは決してありません。あなたは何か類似したキューを持つことができます。 –

+0

@Amit長い一連のAPI呼び出しを起動する必要があります。失敗した場合は、追加の呼び出しのチェーンを停止します。一度に1つのオブジェクトしか受け付けないAPIとやりとりしているので、すべてのオブジェクトを送信するために20回のようにヒットする必要があります。 –

答えて

3

あなたはそれらを順に( - 私は、自分自身を減らす好むまたはループのために定期的に使用して約束のチェーンを設定)を処理するために減らすことができます。

let promise = items.reduce((carry, current) => { 
    return carry.then(arr => { 
     return asyncAPIcall({ body: current }).then(result => arr.concat([ result ])); 
    }); 
}, Promise.resolve([])); 

promise.then(finalResult => { 
    console.log('final result:', finalResult); 
}); 

これらの約束の結果を実際にキャプチャする必要がない場合は、これ以上必要な場合があります。また、最後には約束事があります。約束事には、それぞれの約束の結果の配列が含まれており、元の配列位置に対応しています。

asyncAPIcallの模擬バージョンもあります。ここで操作の順序を示すのに役立ちます。メソッドがどのように/どこで呼び出されたかをトレースする場合に役立ちます。

function asyncAPIcall(obj) { 
    console.log('asyncAPIcall for:', obj); 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      let resolution = obj.body + 5; // change the value in some way, just to show that input !== output 
      console.log('resolving with:', resolution); 
      return resolve(resolution); 
     }, 100); 
    }); 
} 
+1

私はそれを試してみましょう。推薦してくれてありがとう! –

+0

幸運を!最後に結果を必要としない場合、多くのアレイの詐欺行為は完全に消える可能性があります。必要に応じて、結果を気にしない簡単なバージョンを追加できます。 – dvlsg