if/else 块带有 return 和 ajax 承诺

if/else block with a return and an ajax promise

我有一个 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 请求完成之前被 returned。

现在 XHR 请求实际上是一个承诺,所以我可以接听电话并使用 then 但我的 sessionStorage 数据没有使用承诺。

有没有什么办法可以让我拥有与第二个示例相同的数据结构,但我的承诺是这样吗?

我想要一种方法来简单地 return 使用任何必要策略(ajax、会话等)的数据。但目前看来我被迫从 ajax 请求的 .then 子句中设置我的数据,这导致我到处都有逻辑。

希望这是有道理的,如果没有请问。

同步解析异步调用将不起作用。所以 your data = this.loadXHRData(); 将无法以这种方式运行。

这意味着您的函数应该 return 由您的被调用方解决一些问题,因为您的 AJAX 调用无法在此处在线解决

所以我们可以 return 一个 Promise 而不是解析值 this.getSessionStorageData(); returns:

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();
}

你的被调用者应该通过以下方式解决这个 Promise:

myFunction().then(function(data) {
 // do stuff with the data
});