2017-07-11 4 views
-1

私はajax呼び出しを行い、結果を使って約束を解決する関数を持っています。残念ながら、APIは結果を100に制限し、オフセットパラメータを使用して次の100を取得する必要があります。約束を解決する前に、必要なすべてのajax呼び出しを行うにはどうしたらいいですか(API応答は合計値を提供するので、呼び出し回数を決定できます)約束を解決する前に複数のajax呼び出しを実行する

let currentOffset = 0; 
    let totalCount; 
    let offsetCount; 

const makeCall = function(camp) { 
     return new Promise(function(resolve, reject) { 
      api.get(camp, currentOffset, e => { 
       totalCount = e.totalCount; 
       offsetCount = Math.floor(totalCount/100) 
       let payload = e.payload; 
       for (var a in payload) { 

        myArray.push({ 
         'id': payload[a].id, 
         'text': payload[a].text, 
         'url': ads[a].url, 
        }); 
       } 
       resolve(); 
      }); 
     }); 
    }; 
+0

'makeCall'を複数回呼び出すことから複数の約束をしてから、' Promise.all'を使って、すべてが完了したときに解決する別の約束を作ります。論理を自分で書いてはいけません。 – Bergi

+0

'payload'が配列であると仮定し、' for ... in'列挙体を使わないでください(https://stackoverflow.com/q/500504/1048572)! – Bergi

+0

返されるアイテムの数が正確にわからず、返されたアイテムの数に基づいて決定する必要があると思われますか? さらに多くの結果が予想される場合は、最初の約束の範囲内で新しいPromiseを作成することができます。 (これは、あなたが作成したすべての約束事が、まだ項目がある場合に後続のものを作ることができるように、関数にすることができます)。 欠点は、次のように処理が完了するまで待つ必要があるため、遅くなる可能性があるということです。 –

答えて

0

これを行うための最善の方法は、AJAX呼び出しのそれぞれの約束を作成し、Promise.all()を使用することです。ここで

は、私はちょうど最初の100を取得し、解決するために使用していた機能ですすべての要求がいつ成功したかを判断します。

以下のスニペットのようなものです。この約束は、すべての呼び出しが成功すると解決されます。 ajaxリクエストのいずれかが失敗した場合、決して解決されないことを覚えておいてください。それを処理するための何かを追加する価値があります。

let currentOffset = 0; 
let totalCount; 
let offsetCount; 

const makeCall = function(camp) { 
    let apiPromises = []; 

    // Repeat the below for each ajax request 
    apiPromises.push(
    new Promise(function(resolve, reject) { 
     api.get(camp, currentOffset, e => { 
      totalCount = e.totalCount; 
      offsetCount = Math.floor(totalCount/100) 
      let payload = e.payload; 
      for (var a in payload) { 

       myArray.push({ 
        'id': payload[a].id, 
        'text': payload[a].text, 
        'url': ads[a].url, 
       }); 
      } 
      resolve(); 
     }); 
    })); 

    return Promise.all(apiPromises); 
}; 
+0

私は電話をかけるまでの総カウントがわからない場合どのように私はapiPromises.pushをリピートするために特定の回数を設定することができます –

+0

取得する合計結果の数を知っていますか?ここでの質問は、ajax呼び出しをいつ停止するかを決定する方法と考えられます。 – KenneyE

+0

合計結果はajaxレスポンスに示されています。応答にはオブジェクトの配列(ペイロード)とキーの合計数が含まれています –

0

あなたはその後、アヤックスの必要な数を作成し、オプションの数を決定するための最初の呼び出しを使用することができ、値の残りの部分と各AJAX呼び出しのために、対応する約束を取得するために呼び出します。他のすべてのajax呼び出しが完了したら、最初の約束を解決してください。その部分はPromise.all()で行うことができます。

let currentOffset = 0; 
let totalCount; 
let offsetCount; 

const makeCall = function(camp) { 
    // Repeat the below for each ajax request 
    return new Promise(function(resolve, reject) { 
     let apiPromises = []; 

     api.get(camp, currentOffset, e => { 
      totalCount = e.totalCount; 
      offsetCount = Math.floor(totalCount/100) 
      let payload = e.payload; 
      for (var a in payload) { 

       myArray.push({ 
        'id': payload[a].id, 
        'text': payload[a].text, 
        'url': ads[a].url, 
       }); 
      } 

      for (var numCalls = 1; numCalls < offsetCount; numCalls++) { 
       // Increment currentOffset here 
       apiPromises.push(new Promise(function() { 
        api.get(camp, currentOffset, e => { 
         // Add each value to array 
        } 
       } 
      } 

      Promise.all(apiPromises).then(resolve); 
     }); 
    }); 
}; 

いくつかの詳細は記入する必要がありますが、その要点はあります。

関連する問題