我正在尝试使用jQuery同时进行2x Ajax调用(异步),如下所示:
function displayAccount() {
$.when(doGet("accounts/1", null),
doGet("orders/1", null))
.done(displayAccountSuccess);
}
function displayAccountSuccess(accountJson, ordersJson) {
console.Info(accountJson);
console.Info(ordersJson);
}
当我这样做时,在调用/处理2x displayAccountSuccess
之前调用doGet
。当然,两个方法参数的值是undefined
。
显然我的doGet
没有回复承诺:(
对于那种方法......
function doGet(endpoint, queryString)
{
var url = ApiWebsite + "/" + endpoint;
if (queryString)
{
url += "?" + queryString;
}
var authorizationHeader = isAuthenticated()
? "bearer " + localStorage.getItem(LocalStorageJwt)
: "";
$.ajax({
url: url,
headers: {
authorization: authorizationHeader
}
})
.done(function(json)
{
return json;
})
.fail(function(data1, data2){
displayError("fail");
}).promise();
}
好的 - 现在这很有趣:) ajajx.done
方法在那里有正确的json响应!所以我 - 思考 - 我将json数据返回给调用者。
现在,如果我更改代码:
$.ajax(....
到
return $.ajax(....
when.done(..)
函数 延迟,仅在完成2x ajax调用后调用!好极了! ..但是...这个数据的值是一个包含3个项目的数组.. data, successTest, jqXHR
:(当然,我可以从数组插槽0(accountJson[0]
)获取json值,但这意味着我不理解这里非常基本的东西:(
我希望我的done()
方法只接受2x json对象,而不是完整的SUCCESS(或失败)数组。
我希望这是有道理的:脸红:
答案 0 :(得分:1)
使用function doGet(endpoint, queryString)
{
var url = ApiWebsite + "/" + endpoint;
if (queryString)
{
url += "?" + queryString;
}
var authorizationHeader = isAuthenticated()
? "bearer " + localStorage.getItem(LocalStorageJwt)
: "";
return $.ajax({
url: url,
headers: {
authorization: authorizationHeader
}
})
.then(function(json) {
return json;
}, function(){
displayError("fail");
});
}
返回承诺并过滤返回的内容
done()
问题是.done
返回实际的延迟对象,因此您将始终在后续return
回调中获得相同的参数。你不能then
。
then
将返回一个新的承诺,因此它返回的是从那一点开始在链中使用的内容。
查看展示您问题的小型演示文档(https://jsfiddle.net/5cm3grg3/),然后取消评论prog.cpp:22:52: error: taking address of temporary [-fpermissive]
部分,看它是否正常工作。