简化嵌套的promise和循环

时间:2015-09-30 19:35:19

标签: javascript angularjs angular-services

我正在建立一个有角度的应用程序,我正在努力更好地了解承诺 当我使用异步调用(如$ http)进行分析时,我通常会将它们包装在服务中,然后在我的控制器中调用它们:

...

function whatever(arguments) {
    dataService.getUser(arguments)
        .then(onUserComplete)
        .then(dataService.getExtra)
        .then(onExtraComplete)
        .catch(onError);

    function onUserComplete(user) {
        //do something with user
        ...
        // return user id (because we are
        // supposing that getExtra is
        // requiring an id as argument)
        return user.id;
    }

    function onExtraComplete(extra) {
        // do something with extra
        // no need to return anything,
        // we are the last element of the
        // chain.
    }

    function onError(error) {
        console.log(error);
    }
}

...

这有助于我保持每个功能都可以理解和维护,易于阅读和一致......至少在我需要处理收集之前。 假设我需要做与以前相同的事情,但不是拥有一个用户,而是获得整个用户集合(我仍然需要获得每个用户的额外数据)。 我做的是这个:

...

function whatever(arguments) {
    dataService.getUsers(arguments)
        .then(onUsersComplete)
        .catch(onError);

    function onUsersComplete(users) {
        users.forEach(function(user) {
            dataService.getExtra(user.id)
                .then(onExtraComplete)
                .catch(onError);
        });
    }

    ...
}

...

这是我尝试遵循编码风格的最佳方式吗? 甚至可以用单一的承诺链来解决我的问题吗? 感谢

1 个答案:

答案 0 :(得分:1)

您可以使用Promise.allDocumentation)等待一系列承诺。

dataService.getUsers(arguments)
    .then(users => users.map(
        user => dataService.getExtra( user.id )
    ))
    .then( Promise.all )
    .then( user_extra => /* get array with user data as result */ )
    .catch( onError );

我们将用户映射到您的函数返回的promise数组,然后使用Promise.all捆绑所有promises。在下一个.then()中,所有用户都会加载额外数据并在结果数组中提供。