1

我试图在通过 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函数触发的数组名称值仍未定义。从函数的角度来看,即使对象值尚未设置,延迟对象也会被解析。从那以后,我尝试了多种方法来根据整个 ajax 调用的完成和变量的设置来延迟 API 对象,但我有点坚持这样做的最佳方法。

任何指针将不胜感激!谢谢。

4

3 回答 3

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
});
于 2012-07-29T01:25:53.133 回答
0

如果问题是由于在“then”回调之后运行的“success”回调,您也可以尝试将成功回调转换为 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() {
    // ...
});
于 2012-07-29T01:30:30.923 回答
0

您使用的原因$.when是当您关联多个 Promise、异步任务等的回调时。从 jQuery 1.5 开始,所有调用$.ajax和所有包装器($.get$.post)都返回Promise$.when因此,除非您想这样做,否则您不需要用语句包装此调用$.when(ajaxCall1, ajaxCall2)

由于要过滤来自服务器的结果,因此应该使用 promise 的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()还允许您过滤(更改传递给的数据)错误回调。

于 2013-01-29T02:32:30.137 回答