我正在努力了解如何使用AngularJS 1.5.7执行强制顺序请求。
现在,我正在重构一些将新用户插入到用户列表中特定位置的代码,以处理多个用户的插入。
我试图缩短代码,以便更清楚地找出问题所在。
这些是原始逻辑:
代码向我的API服务器发送一个处理正确插入的请求,然后在前端刷新列表:
var users = [
{id: "1", name: "Jack", order: "0"},
{id: "2", name: "Jill", order: "1"},
{id: "3", name: "john", order: "2"}
];
var person = {id: "4", name: "Erik", order: "0"};
UserProvider.update(person.id, {
order: person.order
}).then(function () {
return refreshUserList();
});
新用户列表如下:
{id: "4", name: "Erik", order: "0"}
{id: "1", name: "Jack", order: "1"}
{id: "2", name: "Jill", order: "2"}
{id: "3", name: "john", order: "3"}
这就是我要实现的目标:
现在,我尝试按如下顺序插入多个用户:
// The list of persons are dynamic depending on the webmasters actins in the front-end
var persons = [
{id: "4", name: "Erik", order: "0"},
{id: "5", name: "Ellen", order: "1"},
{id: "6", name: "Esther", order: "2"}
];
_.forEach(persons, function (person, index) {
UserProvider.update(person.id, {
order: person.order
}).then(function () {
return refreshUserList();
});
});
这是我期望发生的事情:
{id: "4", name: "Erik", order: "0"}
{id: "5", name: "Ellen", order: "1"}
{id: "6", name: "Esther", order: "2"}
{id: "1", name: "Jack", order: "3"}
{id: "2", name: "Jill", order: "4"}
{id: "3", name: "john", order: "5"}
但是由于每个UserProvider
请求都是异步的,所以我无法保证每个请求都将按照我想要的顺序完成,因此API可以一次向每个用户插入一个。我该如何解决?
答案 0 :(得分:1)
要顺序执行承诺,请从上一个承诺链接:
var persons = [
{id: "4", name: "Erik", order: "0"},
{id: "5", name: "Ellen", order: "1"},
{id: "6", name: "Esther", order: "2"}
];
function sequentialPromise (persons) {
var promise = $q.when();
persons.forEach(function (person) {
promise = promise.then(function() {
return UserProvider.update(person.id, {
order: person.order
});
});
});
return promise;
}
该代码创建一个初始的空承诺,然后从该初始承诺中按顺序进行链接。
在AngularJS框架中,使用$q Service Promise非常重要,因为它们已与AngularJS执行上下文集成在一起。 AngularJS通过提供自己的事件处理循环来修改常规JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才能受益于AngularJS数据绑定,异常处理,属性监视等。
避免使用ES6承诺和async
/ await
,因为它们未与AngularJS执行上下文集成。