我使用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
上下文。
答案 0 :(得分:3)
使用$.when
return $.when([]);
它将一个值(或一组值或一个promise)转换为一个promise。
在ES6中,责任是独立的 - 将值或承诺转换为承诺是通过Promise.resolve
答案 1 :(得分:1)
如果某个函数有时是异步的并且可以返回promise,那么始终返回promise以保持一致性是有意义的。 jQuery有$.when()
可以从值创建promise。所以
return [];
将成为
return $.when([]);