【发布时间】:2016-08-12 07:05:26
【问题描述】:
在我的代码中,我有一个包含 3 个嵌套 AJAX 调用的函数,为了让它工作,我必须设置 Async=false。
据我所知,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;
这个功能很好用,我得到数据端一切正常。
然后我将函数更改为使用promises而不是Async=false,
这是 edited 函数,带有promises:
//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);
}
新函数不起作用,我从 firstPromise 中返回一个带有反斜杠的错误 json,并且返回的 orders 对象为空。
知道我做错了什么吗?我花了这么多时间,但无法弄清楚。
提前致谢。
【问题讨论】:
-
请分享您的其余功能(必要时删除不相关的代码)。您需要返回一个承诺而不是订单数组,并在该承诺的
resolve callback中访问您的订单数组。 -
我编辑了我的问题。
-
在嵌套的 Promise 中,你必须返回嵌套的 Promise。返回 secondPromise 和 thirdPromise 而不是只声明它们。
-
另外,您必须使用
then而不是done才能链接承诺。 -
你真的需要嵌套它们吗?看起来它们可以并行运行。
标签: javascript ajax asynchronous promise