【发布时间】:2023-04-06 08:53:01
【问题描述】:
我有一个 AngularJS 控制器,它正在对返回承诺的服务进行异步调用。
$myService.getData(ctrl.state)
.then(function(data) {
updateInterface(data);
});
当 promise 返回时,我正在更新界面中的数据。 但是,如果我进行了两次调用,并且第一次调用在第二次调用之后返回,那么界面将根据陈旧状态使用不正确的数据进行更新。
我想了几个办法来处理这个问题:
- 跟踪某种类型的 Promise 标识符,当 Promise 返回时,仅在与最新的匹配时处理它。
- 跟踪承诺,直到它返回。如果进行了另一个调用,请取消该承诺。取消可以由服务处理。
getData 方法进行 ajax 调用 ($http.get),所以我可以通过在 _httpTimeout 对象上调用 resolve() 来取消它。然而,这似乎非常特定于 Promise 中的逻辑。
是否有处理此异步问题的最佳做法? JsFiddle is here.
var testDiv = document.getElementById('test');
function loadData(query, pause) {
var data = query;
return new Promise((resolve, reject) => {
setTimeout(function() {
resolve(data);
}, pause);
});
}
var test = function(query, pause) {
loadData(query, pause)
.then(function(data) {
console.log("got back test data", data);
testDiv.innerHTML = data;
});
};
test("first", 1000);
test("second", 0);
<div id="test">
</div>
【问题讨论】:
-
"那么界面将使用不正确的数据进行更新" 我不知道角度,但你确定吗?看起来很傻,因为回调直接链接到请求。这就是承诺的用途,不是吗?
-
@Kevin 我在 vanilla javascript 中添加了一个 jsfiddle 来说明这个问题。
-
@Igor 谢谢。我听说过 bluebird,但不想使用外部库。那篇文章还包括我将使用的 vanilla js 解决方案。
-
解决 _httpTimeout 在这个流程中似乎没问题。
标签: javascript angularjs asynchronous