简单的迁移AngularJS承诺从成功/错误到然后

时间:2016-05-29 00:03:06

标签: angular-promise

我刚才有一个(代表我很愚蠢)关于如何从Angular 1.3 promises迁移到Angular 1.5 promises的问题,而不是代码方式,而是我使用它们的方式。然而,我可能不是这个星球上最愚蠢的人,所以我指的是你,乔伊,我唯一的劣势:-p

我使用promises作为方法(例如服务方法)的结果,因此解析器会知道发生了什么。 E.g。

function myLogin(user,pass) {
    return $http({url:'/auth/login', data:{user:user,pass:pass}).
           success(function (r) { loggedin = true; }).
           error(function (r) { loggedin = false; });
}

然后我也可以写:

myLogin("Joe","12345").success(function (r) { console.log("WOW!"); }).
                      .error(function (r) { console.error(":-("); });

现在,在用当时替换成功/错误之后,这不再可能如果您保留此代码表单。 这是因为then没有返回原始承诺,而是执行函数的结果。

所以,如果我写:

function myLogin(user,pass) {
    return $http({url:'/auth/login', data:{user:user,pass:pass}).
           then(function (r) { loggedin = true; } ,
                function (r) { loggedin = false; });
}

myLogin("Joe","12345").then(function (r) { console.log("WOW!"); },
                            function (r) { console.error(":-("); });

下面的then得到的是第一对函数(以执行者为准)返回的内容!

我该怎么办?

提示:我读过有一个选项可以通过$ http提供商重新启用成功/错误,但这不会持续很长时间......

1 个答案:

答案 0 :(得分:0)

答案很简单,因为我一开始并没有意识到这一点,所以我花了一个小时搜索没有结果。所有那些甚至没有问过的人都是对的!

所有你需要做的(亲爱的Joy)是修改myLogin功能并保留最初的承诺。然后应用它,并从函数返回原始承诺。即。

function myLogin(user,pass) {
    var promise = $http({url:'/auth/login', data:{user:user,pass:pass});
    promise.then(function (r) { loggedin = true; } ,
                 function (r) { loggedin = false; });
    return promise;
}

myLogin("Joe","12345").then(function (r) { console.log("WOW!"); },
                            function (r) { console.error(":-("); });

这样,通过这种最小的适应性,您可以轻松地迁移您。 当然,允许您选择返回内容的新then想法更强大,可能如果您有时间重新设计代码,在许多方面会更好。