別の配列に基づいて構築された約束事を解決してオブジェクトの配列を構築する必要があります。Ajaxコールの配列を構築するときにJQuery Ajax成功コールバックが機能しない
私はletters = ['a', 'b', 'c']
の配列を持っているとしましょう。その後、私はこのように、それはAjaxがPARAMとして各文字を使用して呼び出して作るマップ:結果
var result = letters.map(function (letter) {
return $.getJSON('myuri', { param: letter });
};
、私はアヤックスの約束を持つ配列を取得します。それから私はこのようにそれを解決:
Promise.all(result).then(function (response) {
console.log(response);
});
ログはすべてのAJAX呼び出しのために元の応答を印刷しています。それまではすべてがうまくいきます。
var letters = ['a', 'b', 'c'];
var result = letters.map(function (letter) {
return $.getJSON('myuri', { param: letter })
// Chaining with success callback
.done(function (response) {
return {
'custom_attr': response.x,
'athor_custom_attr': response.y
};
});
});
Promise.all(result).then(function (response) {
console.log(response);
});
問題は成功コールバックです:しかし、私はこのように、私はそれらを作成するためのAjaxの成功コールバックを使用してみましたので、私は、カスタムオブジェクトをしたい、オリジナルの応答をしたくありませんアレイ作成時に干渉しません。実際には、コールバックの何かへのリターンを変更することはできますが、それは何の違いもなく、コードは元の応答の配列を返します。
$http
サービスを使用してAngularでこれを実行したとき、それは正常に機能しましたが、$.getJSON
を使用するJQueryでは機能しません。なぜこれが起こっているのか理解できません。
ありがとうございます。
'map'関数では、各文字を[jqXHR](http://api.jquery.com/Types/#jqXHR)オブジェクトにマッピングします。 Promiseが解決されたら、 'result'配列をもう一度繰り返し、各jqXHRのレスポンスデータを必要なカスタムオブジェクトにマップする必要があります。 – romellem
しかしそれはPromise.allがしなければならないことです。これは、すべての約束を非同期的にトリガーし、それぞれの対応する結果で配列を構築します。 –
[Promise.all(iterable)メソッドは、iterable引数のすべての約束が解決されたときに解決する約束を返します。または、拒否する最初に渡された約束の理由で拒否します。](https://developer.mozilla。 org/ja-jp/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)を参照してください。だから '$ .getJSON'は約束を返します。だから 'result'はPromisesの配列です。 「Promise.all(結果)」は、「すべての約束を約束する」と言っているので、「これらすべての約束が終わったら、この成功の機能を実行する」と言います。この関数では、カスタムオブジェクトを作成する場所です。 – romellem