我有一个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
,但我的sessionStorage数据没有使用承诺。
有没有什么方法可以像我的第二个例子一样拥有相同的数据结构,但是我的承诺还是不可能?
我想要一种方法来简单地使用任何必要的策略(ajax,session等)返回数据。但目前看来我被迫从ajax请求的.then
子句中设置我的数据,这导致我在所有地方都有逻辑。
希望这是有道理的,如果不是,请随便提出。
答案 0 :(得分:1)
同步解析异步调用将不起作用。因此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
});