使用AngularJS强制执行顺序请求

时间:2018-12-07 16:03:44

标签: angularjs angular-promise

我正在努力了解如何使用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可以一次向每个用户插入一个。我该如何解决?

1 个答案:

答案 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执行上下文集成。