我试图创建一个执行ajax调用的全局可访问函数:
function getDataModel(dataModelName = "dm1") {
// I want to send the deferred object back
return $.Defered($.get(url + dataModelName, function(r){
return new DataModel(r)
})
}
function DataModel(data){
this.foo = data.foo
this.bar = data.bar
}
我希望在创建后将DataModel对象发送到另一个函数:
console.log("1");
// After the deferred object finishes being built, use it in another function,
// but that function can't be called till the object is built
$.when(getDataModel(fromSelection)).then(function(data,status,jqXHR){
console.log("2")
console.log(data)
console.log(status)
console.log(jqXHR)
init(data)
})
function init(data){
console.log("3")
console.log(data)
}
这是输出:
> 1
> 2
> undefined
> undefined
> undefined
> 3
> (error because 'data' isn't defined)
很明显,它以正确的顺序执行,但我没有得到该对象。这是因为它不是jQuery对象吗?如果不是......
我在这里做错了什么?我查看了docs,但它没有任何与此有关的内容。我还查了几篇帖子:
jQuery When Done on dynamically pulled function call。但是,这会在函数内部创建promise对象。
jQuery.when - Callback for when ALL Deferreds are no longer 'unresolved' (either resolved or rejected)?。这是在$.when
内直接执行ajax调用,类似于文档。
但没有找到答案。而且,我意识到我对承诺的理解缺少了一些东西,所以如果有人能够对我做错了什么有所了解,那将是一个巨大的帮助。
答案 0 :(得分:1)
一些问题:
$.get
的回调函数不能用于返回将解析Deferred对象的值。为此目的使用then
。$.get
已经返回Deferred对象,因此无需将其传递给$.Deferred()
。$.when
非常有用,但由于您刚从函数中返回了一个承诺,因此您不需要它,并且可以直接应用then
关于函数的返回值。then
回调,因此 jqXHR 和状态都不可用。以下是更正后的代码:
function getDataModel(dataModelName = "dm1") {
return $.get(url + dataModelName).then(function (r) {
return new DataModel(r);
});
}
和
getDataModel(fromSelection).then(function (data) {
console.log("2");
console.log(data);
init(data);
});