2016-04-08 8 views
0

私はこのAPIコールを持っています。しかし、私はそれが本当に私が欲しいものではないことを認識した、私はデータが送信され、一度に1つの世話をすることを確認したい。javascript api特定の順序でデータを呼び出し、送信し、処理します

data [n]はdata [n + 1]が送信される前に返されました。

この理由は次のとおりです。

下図のように私はそれを行う場合は、サーバはまだランダムな順序でそれを取得し、そのためには、ランダムな順序で私のDBにデータを保存します。 (またはうまくないランダムな、重いデータが遅く処理されます)

var promiseArray = []; 
for (var i = 0; i < data.length; i++) { 
    var dataPromise = $http.post('/api/bla/blabla', $httpParamSerializer(data[i])) 
    .then (function (response) { 
     //return data for chaining 
     return response.data; 
    }); 
promiseArray.push(dataPromise); 
} 

$q.all(promiseArray).then(function (dataArray) { 
//succes 
}).catch (function (errorResponse) { 
//error 
}); 

どのように私はデータは、送信および処理され、返されたスムーズな方法で、一度に一つであることを確認することができますか?

答えて

3

あなたはこのような何か行うことができます:

var i = -1; 
processNextdata(); 

function processNextdata() { 
    i++; 

    if(angular.isUndefined(data[i])) 
     return; 

    $http.post('/api/bla/blabla', $httpParamSerializer(data[i])) 
     .then(processNextdata) 
} 

アップデート:すべての後

var i = -1; 
processNextdata(); 

function processNextdata() { 
    i++; 

    if(angular.isUndefined(data[i])) 
     return; 

    $http.post('/api/bla/blabla', $httpParamSerializer(data[i])) 
     .then(function(result) { 
      // do something with a single result 

      return processNextdata(); 
     }, errorCallback); 
} 

コールバックが行われます:

コールバックすべての結果の後に

var i = -1, resultData = []; 
processNextdata() 
    .then(function(result) { 
     console.log(result); 
    }, errorCallback); 

function processNextdata() { 
    i++; 

    if(angular.isUndefined(data[i])) 
     return resultData; 

    $http.post('/api/bla/blabla', $httpParamSerializer(data[i])) 
     .then(function(result) { 
      resultData.push(result.data); 
      return processNextdata(); 
     }, $q.reject); 
} 
+0

どのように成功とeを追加しますかこれに対するコールバックコールバック? –

+0

すべてが完了した後、またはすべての要求の後に成功コールバックが必要ですか? –

+0

がすべて終了したとき。 –

0

米国Promise.all([...])方法をngの、ドキュメントには、次のことを示しています

Promise.all(反復可能)メソッドは、反復可能な引数での約束がすべてを解決してきたとき解決の約束を返すか、の理由で拒否します拒否する最初の約束を守った。

これは、同期操作の予想される順序はないが、実際には約束が互いに並行して実行され、任意の順序で完了できることを示しています。

あなたの場合、となりますので、あなたの約束を望む予想された注文ですので、Promise.all([...])を使用してもあなたの要件を満たしません。

代わりにできることは、個々の約束を実行することです。次に、並列実行可能なものがある場合はPromise.all([...])メソッドを使用してください。あるいは、

var response = request(myRequest); 

function request (req) { 
return new Promise(function (resolve, reject) { 
    request({ 
     url: url 
     , port: <port> 
     , body: req 
     , json: <true/false> 
     , method: '<POST/GET>' 
     , headers: { 

     } 
    }, function (error, response, body) { 
     if (error) { 
      reject(error); 
     } else { 
      resolve(body); 
     } 
    }); 
}); 

あなたは、この関数を呼び出し、結果を格納することができます

私は、引数としてリクエストを受け取るメソッドを作成し

は、その後、生成された約束を返します。配列を作成して関数を呼び出すことができます:

var requests = [request1, request2, ..., requestN]; 
var responses = []; 
for (var i = 0; i < requests.length; i++) { 
    responses.push(request(requests[i])); 
} 
関連する問題