AJAX承诺不等待完成

时间:2015-04-01 20:03:12

标签: jquery ajax getjson

我已经阅读了有关此问题的Stack Overflow和其他地方的所有帖子,但似乎没有任何效果。我需要在他们被允许购买之前检索用户的信用。一切似乎都在工作到早些时候。这是我认为正在运行的代码:

function getCredits() {
    return $.getJSON('users/getCredits').done(function(resp) {
                return parseInt(resp.credits);
          });
}

当我发现它没有按预期工作时,我尝试设置一个外部变量,.done()会修改。

function getCredits() {
    var active_credits;
    $.getJSON('users/getCredits')) 
        .done(function(resp) {
            active_credits = parseInt(resp.credits);
        });

     return active_credits;
}

我也试过玩.when()和.then()方法,我对此并不熟悉。

function getCredits() {
    $.when($.getJSON('users/getCredits')) 
    .then(function(resp) {
        active_credits = parseInt(resp.credits);
    });
 }

我唯一能找到工作的是使用$ .ajax()并将async选项设置为false。但有了这个,我得到了一个弃用警告,而且我已经阅读了几个帖子,警告这是不好的做法。

任何有关此的帮助将不胜感激。我对.done()的假设一直等到HTTP请求完成处理。

更新

所以这是我最近的尝试。我已按照本帖和其他帖子的建议传递回调。但是在尝试读取方法的返回值时,我仍然收到一条未定义的消息。我不确定我做错了什么。

function getCredits() {
   var active_credits;

   function requestCredits(callback) {
     $.getJSON('users/getCredits', callback).done(function(resp) {
       callback(resp);
     });
   }

   requestCredits(function(resp) {
     active_credits = parseInt(resp.credits);
   });

   return active_credits;
}

我也试过返回回调返回的值..没有运气。

 function getCredits() {
       var active_credits;

       function requestCredits(callback) {
         $.getJSON('users/getCredits', callback).done(function(resp) {
           callback(resp);
         });
       }

      return requestCredits(function(resp) {
         return parseInt(resp.credits);
       });
    }

1 个答案:

答案 0 :(得分:3)

如果您正在做这样的事情var credits = getCredits();其余的代码将继续执行,并且信用额度将不会达到预期目标。

最不复杂的解决方案是放弃getCredits()并直接使用getJson调用。类似下面的代码。

$.getJSON('users/getCredits').done(function(resp) {
    var credits = resp.credits;

    //the rest of your code that depends on credits.
});

如果你想保留getCredits(),你可以做这样的事情。您总是必须进行回调,这只是javascript中异步的本质。这完全脱离了我的头脑。

function getCredits() {
    return $.getJSON('users/getCredits');
}

//some other code that uses getCredits()
getCredits().done(function(resp){
  var credits = resp.credits;

  //the rest of your code that depends on credits.
});