如何处理依赖其他承诺的承诺?

时间:2013-11-20 16:17:07

标签: javascript angularjs promise

我有一个AngularJS承诺(users)依赖于另一个承诺(userTypes)在我操作它之前就已经完成了。两个promises的结果都在控制器中使用,因此,我认为这意味着我需要将promise中的实际数据分配给$scope变量:

// this is all in my controller somewhere
userService.getUserTypes().then(function( data ) {

    $scope.userTypes = data;

}).then(function( data ) {

    userService.getUsers().then(function( data ) {

        $scope.users = data;

        for( var user in $scope.users ) {

            $scope.users[ user ].userType = $filter("filter")( $scope.userTypes, { id: $scope.users[ user ].userTypeID })[0];

        }

    });

});

来自userService的示例结果:

// userService.getUserTypes()
[
    {
        "id": 1,
        "type": "Administrator"
    },
    {
        "id": 2,
        "type": "User"
    }
]

// userService.getUsers()
[
    {
        "id": 1,
        "name": "Sean Walsh",
        "userTypeID": 2
    },
    {
        "id": 2,
        "name": "Joe Blow",
        "userTypeID": 2
    },
    {
        "id": 3,
        "name": "Joe Administrator",
        "userTypeID": 1
    }
]

这是一个人为的例子(很可能是语法错误),但我相信它能准确地显示我想要完成的事情:我想确保我的Angular模型准确地表示来自服务器的对象图,所以我是将实际的userType对象分配给user,而不是仅仅使用ID表示类型。

我对这种方法的关注是,从嵌套的then()调用开始,我已经可以看到一些“回调地狱”。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

从其他承诺体系结构推断,您很可能会从then返回承诺,然后该承诺将成为下一个.then应用的对象。

// this is all in my controller somewhere
userService.getUserTypes().then(function( data ) {

    $scope.userTypes = data;

}).then(function(data) {

    return userService.getUsers();

}).then(function( data ) {

    $scope.users = data;

    for( var user in $scope.users ) {

        $scope.users[ user ].userType = $filter("filter")( $scope.userTypes, { id: $scope.users[ user ].userTypeID })[0];

    }

});;