试图使用jquery $ .when()& .done()使用2x $ .ajax调用但是done()会被立即调用

时间:2017-12-14 12:14:45

标签: javascript jquery json ajax

我正在尝试使用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(或失败)数组。

我希望这是有道理的:脸红:

1 个答案:

答案 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] 部分,看它是否正常工作。