如何在不需要Ajax的情况下从一个Promise返回?

4
我正在使用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

我猜这是因为返回 [] 不是一个 Promise,并没有定义 .then() 方法。但是,在这种情况下,我希望返回 [] 作为我的数据负载。
如何解决这个问题?如果可能的话,我倾向于不进行不必要的 Ajax 调用。
更新:值得注意的另一件事是,我需要在返回的内容中保留 this 上下文。

请查看延迟对象 - Nicolai
2个回答

3
使用$.when函数
 return $.when([]);

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

在 ES6 中,这些职责是分开的 - 将值或 Promise 转换为 Promise 是使用 Promise.resolve 完成的。


太棒了,谢谢!这样返回的是[],但我失去了我的this上下文 - 有没有办法包含上下文?查看文档但找不到如何做... - Richard
1
没有直接的方法,而且在jQuery 3.0中,上下文参数会出错。我强烈建议将上下文作为响应的一部分传递或在接收端使用.bind。 - Benjamin Gruenbaum

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

会变成

return $.when([]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接