if / else阻止返回和ajax承诺

时间:2017-09-27 12:30:58

标签: javascript ajax ecmascript-6 es6-promise axios

我有一个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子句中设置我的数据,这导致我在所有地方都有逻辑。

希望这是有道理的,如果不是,请随便提出。

1 个答案:

答案 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
});