作为函数

时间:2017-05-01 22:03:48

标签: jquery promise

我试图创建一个执行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,但它没有任何与此有关的内容。我还查了几篇帖子:

  1. jQuery When Done on dynamically pulled function call。但是,这会在函数内部创建promise对象。

  2. jQuery.when - Callback for when ALL Deferreds are no longer 'unresolved' (either resolved or rejected)?。这是在$.when内直接执行ajax调用,类似于文档。

  3. 但没有找到答案。而且,我意识到我对承诺的理解缺少了一些东西,所以如果有人能够对我做错了什么有所了解,那将是一个巨大的帮助。

1 个答案:

答案 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);
});