在对象内完成ajax调用后触发Javascript回调

时间:2012-07-29 00:54:09

标签: javascript jquery jquery-deferred

我试图在通过AJAX调用创建Javascript对象后触发操作。我的对象看起来像这样:

function API(uid,accessToken){      
        $.ajax("path/to/file", {
            type: "POST",
            data: { user: uid, auth: accessToken },
            dataType: "json",
            success: function(jsonData) {
                arrayname = jsonData[values]
            }
        });
}

我尝试使用JQuery的$ .when函数在对象设置完成后进行回调(即数组中填充了ajax响应),如下所示:

        $.when( API = new API(uid, accessToken) ).then(function() {
                ...success function...
        });

...但$.when函数触发,arrayname值仍未定义。从函数的角度来看,即使尚未设置对象值,也会解析延迟对象。我已经尝试了很多方法来根据整个ajax调用的完成和变量的设置来推迟API对象,但我有点坚持最好的方法来做到这一点。

任何指针都会非常感激!感谢。

3 个答案:

答案 0 :(得分:0)

您可以在创建对象时传递回调函数,如下所示:

function API(uid,accessToken, callback){      
        $.ajax("path/to/file", {
            type: "POST",
            data: { user: uid, auth: accessToken },
            dataType: "json",
            success: function(jsonData) {
                arrayname = jsonData[values]
                callback(jsonData[values])
            }
        });
}

然后像这样实例化对象

var api = new API(uid, accessToken, function(array) {
    // success function
});

答案 1 :(得分:0)

如果问题是由于在“then”回调之后运行的“成功”回调,你可以尝试将成功回调转换为然后回调。我不使用JQuery,但我想它看起来像:

function API(uid,accessToken){      
    return $.ajax("path/to/file", {
        type: "POST",
        data: { user: uid, auth: accessToken },
        dataType: "json",
    }).then(function(jsondata){
        arrayname = jsondata[values]
    });
}

$.when( API = new API(uid, accessToken) ).then(function() {
    // ...
});

答案 2 :(得分:0)

使用$.when的原因是当你关联多个promises,异步任务等的回调时。自jQuery 1.5以来,所有对$.ajax和所有包装器的调用($.get并且$.post)都返回promises。因此,除非您想$.when,否则您不需要使用$.when(ajaxCall1, ajaxCall2)语句打包此调用。

由于您想要从服务器过滤结果,您应该使用承诺的pipe方法:

function API(uid, accessToken)
  return $.post(
    type: 'POST'
    ,data: { user: uid, auth: accessToken }
    ,dataType: 'json'
  )
    .pipe(function(json) {
      return json[values];
    })
  ;
}

这使您可以按照自己的方式编写代码:

API(uid, token)
  .then(
    // success state (same as promise.done)
    function(arrayname /* named from your sample script*/) {
      alert('success! ' + arrayname);
    }
    // error state (same as promise.fail)
    ,function(jqXHR, status, error) {
      console.warn('oh noes!', error);
    }
  )
  .done(function() { /* done #2 */ })
  .fail(function() { /* fail #2 */ })
;

注意:promise.pipe()也允许您过滤(更改传递给的数据)错误回调。