如果不需要Ajax,如何从promise中返回?

时间:2015-06-09 11:42:32

标签: javascript jquery ajax promise

我使用jQuery promises预先填充select选项的值。这工作正常,但我的问题是当实际上不需要Ajax调用时该怎么做,所以代码不会返回一个promise。

如果this.orgId未定义,则下面的代码可以正常工作。但如果不是,我会收到错误:

getFormValues: function() {
    var _this = this;
    return _this.prefillOrgs()
                .then(function(orgId) {
                  _this.globalOptions.orgId = orgId;
                  return true;
                });
},

prefillOrgs: function() {
    if (typeof this.orgId !== 'undefined') {
        return $.ajax({
            type: 'GET',
            url:  '/api/1.0/org_code?exact=true&q=' + this.orgId,
            dataType: 'json',
            context: this
        });
    } else {
        // Doing this produces an error
        return [];
    }
}

返回错误:

Uncaught TypeError: _this.prefillOrgs(...).then is not a function

我想这是因为返回[]不是一个承诺,并且没有定义.then()方法。但是,在这种情况下,我想将[]作为我的数据有效负载返回。

我该如何解决这个问题?如果可能的话,我不想进行不必要的Ajax调用。

更新:另一件值得注意的事情是我需要在返回的内容中使用this上下文。

2 个答案:

答案 0 :(得分:3)

使用$.when

 return $.when([]);

它将一个值(或一组值或一个promise)转换为一个promise。

在ES6中,责任是独立的 - 将值或承诺转换为承诺是通过Promise.resolve

完成的

答案 1 :(得分:1)

如果某个函数有时是异步的并且可以返回promise,那么始终返回promise以保持一致性是有意义的。 jQuery有$.when()可以从值创建promise。所以

return [];

将成为

return $.when([]);