私のコードでは、3つのネストされたAJAX呼び出しを持つ関数があり、それを動作させるためにはAsync=false
を設定しなければなりませんでした。ネストされたAJAX呼び出しのJavaScriptの約束が機能していない
私はAsync=false
が非難されていると読んだので、Async=false
をpromises
に置き換えました。
これは私がそれを編集した前に、私の関数である。
self.getOrders = function (name) {
var orders= [];
var order= function (item, type1, type2) {
var self = this;
self.order= item;
self.type1= type1;
self.type2= type2;
}
$.ajax({
url: "/API/orders/" + name,
type: "GET",
async: false,
success: function (orderResults) {
var mappedOrders = $.map(orderResults, function (orderItem) {
$.ajax({
url: "/API/orders/property/" + orderItem.id + "/type1",
type: "GET",
async: false,
success: function (property1Results) {
$.ajax({
url: "/API/orders/property/" + orderItem.id + "/type2",
type: "GET",
async: false,
success: function (property2Results) {
orders.push(new order(orderItem, property1Results, property2Results));
}
});
}
});
})
}
});
return orders;
この機能は完全に働いた、私はデータは、すべてがうまく働い終了しました。
//The begin of the function- same as first one
var orders= [];
var firstPromise = $.ajax({
url: "/API/orders/" + name,
type: "GET"
});
$.when(firstPromise).done(function (orderResults) {
var mappedOrders = $.map(orderResults, function (orderItem) {
var secondPromise = $.ajax({
url: "/API/orders/property/" + orderItem.id + "/type1",
type: "GET"
});
$.when(secondPromise).done(function (property1Results) {
var thirdPromise = $.ajax({
url: "/API/orders/property/" + orderItem.id + "/type2",
type: "GET"
});
$.when(thirdPromise).done(function (property2Results) {
orders.push(new order(orderItem, property1Results, property2Results));
});
});
});
});
return orders;
と関数呼び出し:
self.populateOrders = function (name) {
var mappedOrders = $.map(self.service.getOrders(name), function (item) {
return new Order(item)
});
self.orders(mappedOrders);
}
新機能
それから私は、これはpromises
で、編集した機能です 、promises
代わりのAsync=false
を使用するように機能を変更しましたは動作していません、私はfirstPromise
バックスラッシュと間違ったjsonから戻ってきて、返されたorders
オブジェクトは空です。
私は間違って何を考えていますか?私はそれに多くの時間を費やしましたが、それを理解できませんでした。
ありがとうございます。
残りの機能は共有してください(必要に応じて関連性の低いコードは削除してください)。 orders配列の代わりに約束を返し、その約束の 'resolve callback'の中でorders配列にアクセスする必要があります。 – Ozan
私は自分の質問を編集しました。 – user3378165
ネストされた約束事では、ネストされた約束事を返さなければなりません。 secondPromiseとthirdPromiseを宣言するのではなく、それを返します。 –