我正在尝试制作多个ajax请求,然后仅在完成所有ajax请求后显示一些内容。我知道我应该使用jQuery promises,但我不完全确定它们是如何工作的。
这是我的代码:
//make first ajax request
$.ajax({
url: 'http://api.com',
success: function(result) {
var promises = [];
//for each result
for(var i = 0; i < result.length; i++) {
//make another ajax request using
//some of the returned data and
//define it as a promise
var promise = $.ajax({
url: 'http://api.com¶m='+result.paramVal,
success: function(result) {
return result;
}
});
//push promise into array
promises.push(promise);
}
//when each promise in the promises array is complete
$.when.apply($, promises).then(function() {
console.log(promises);
});
}
});
这似乎有效,但为了更好地组织这段代码,我希望将所有这些代码放入一个对象中,然后将后续的ajax调用抽象到它自己的方法中。我的代码如下所示:
var myObject = {
firstRequest: function() {
$.ajax({
url: 'http://api.com',
success: function(result) {
var promises = [];
for(var i = 0; i < result.length; i++) {
var promise = myObject.secondRequest(result.param);
promises.push(promise);
}
$.when.apply($, promises).then(function() {
myObject.displayContent(promises));
});
}
});
},
secondRequest: function(paramVal) {
$.ajax({
url: 'http://api.com¶m='+result.paramVal,
success: function(result) {
return result;
}
});
},
displayContent: function(promises) {
console.log(promises);
}
};
在此示例中,运行myObject.displayContent
后,promises中的每个数组项都为undefined
。我认为这是因为myObject.secondRequest
实际上并不是一个承诺本身(此函数中的ajax请求是实际的承诺)。我怎样才能使这种安排有效?
将return
添加到我的ajax承诺有效,但我无法访问返回的ajax对象中的responseJSON
。
secondRequest: function(paramVal) {
return $.ajax({
url: 'http://api.com¶m='+result.paramVal,
success: function(result) {
return result;
}
});
},
以下是从我的$.when.then()
回调中返回的其中一个对象的图像。我可以访问readyState
属性,但不能访问responseJSON
属性。
答案 0 :(得分:1)
您必须将功能传递给.then
,但您立即执行myObject.displayContent
。它应该是:
$.when.apply($, promises).then(function() {
myObject.displayContent(promises)
});
如果您实际上并不需要访问承诺本身,请直接传递该功能:
$.when.apply($, promises).then(myObject.displayContent);
// or with `$.proxy` if you need `this` to refer to the object
$.when.apply($, promises).then($.proxy(myObject, 'displayContent'));
您还必须返回来自secondRequest
函数的承诺:
secondRequest: function(paramVal) {
return $.ajax(...);
}
否则promise
将在
undefined
var promise = myObject.secondRequest(result.param);