当一个promise依赖于另一个promise时,Bluebird的Promise.all()方法

Jef*_*eff 5 javascript promise bluebird

我正在编写一些当前看起来像这样的代码,因为我的代码中有依赖项.我想知道是否有一种更简洁的方法来使用Promise.all()?这是我的伪代码:

        return someService.getUsername()
            .then(function(username) {
                user = username;
            })
            .then(function() {
                return someService.getUserProps(user);
            })
            .then(function(userProps) {
                userProperties = userProps;
                return someService.getUserFriends(user);
            })
            .then(function(userFriends) {
                friends = userFriends;
            })
            .catch(error)
            .finally(function(){
                // do stuff with results
            });
Run Code Online (Sandbox Code Playgroud)

重要的是我需要用户才能为getUserProps()和getUserFriends()进行第二次调用.我以为我可以这样使用Promise.all():

var user = someService.getUsername()
    .then(function(username) {
        user = username;
    })
var getUserProps = someService.getUserProps(user);
var getUserProps = someService.getUserFriends(user);

return Promise.all(user, getUserProps, getUserFriends, function(user, props, friends) {
    // do stuff with results
})
Run Code Online (Sandbox Code Playgroud)

但我不能让这个工作.这是正确使用的案例.all?

jfr*_*d00 9

Promise.all() 是为并行操作而设计的,您可以在其中启动一组异步操作以同时运行,然后它会告诉您何时完成所有操作.

它不会以任何方式排序一个与另一个完成.因此,您不能使用它等待用户准备好,然后让其他操作使用该用户.它只是不是为了那样做而设计的.

您可以先获得用户,然后在完成后,您可以使用Promise.all()我认为可以同时运行的其他两个操作,而不是相互依赖.

var user;
someService.getUsername().then(function(username) {
    user = username;
    return Promise.all(getUserProps(user), getUserFriends(user));
}).then(function() {
    // do stuff with results array
}).catch(function() {
    // handle errors
});
Run Code Online (Sandbox Code Playgroud)