我有一个看起来像这样的if/else
块:
if (this.getSessionStorageData()) {
this.initialData(this.getSessionStorageData());
} else if (this.shouldPerformXHR) {
this.loadXHRData();
}
我想扩展这个块,可以选择将其创建为 switch 语句,也许有点像这样:
let data = [];
if (this.getSessionStorageData()) {
data = this.getSessionStorageData();
} else if (this.shouldPerformXHR) {
data = this.loadXHRData();
}
return data;
但loadXHRData
是 AJAX 请求。我在这个例子中猜测,如果shouldPerformXHR
为真,数据将在 AJAX 请求完成之前返回。
现在 XHR 请求实际上是一个承诺,所以我可以接听电话并使用then
但我的会话存储数据没有使用承诺。
有什么方法可以像我的第二个示例一样拥有相同的数据结构,但有我的承诺还是这是不可能的?
我想要一种方法来简单地使用任何必要的策略(ajax、会话等)返回数据。但目前看起来我被迫从 ajax 请求的.then
子句中设置我的数据,这导致我到处都有逻辑。
希望这是有道理的,如果没有,请问。
同步解析异步调用将不起作用。因此,your data = this.loadXHRData();
将无法以这种方式运作。
这意味着您的函数应该返回一些内容以由您的被调用方解析,因为您的 AJAX 调用无法在此处内解析
因此,我们可以返回一个 Promise,它解析this.getSessionStorageData();
返回的值:
if (this.getSessionStorageData()) {
return Promise.resolve(this.initialData(this.getSessionStorageData())); // Will return a new Promise which is then-able.
} else if (this.shouldPerformXHR) {
return this.loadXHRData();
}
您的被叫方应通过以下方式解决此承诺:
myFunction().then(function(data) {
// do stuff with the data
});