我试图在通过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对象,但我有点坚持最好的方法来做到这一点。
任何指针都会非常感激!感谢。
答案 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()
也允许您过滤(更改传递给的数据)错误回调。