我刚才有一个(代表我很愚蠢)关于如何从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提供商重新启用成功/错误,但这不会持续很长时间......
答案 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
想法更强大,可能如果您有时间重新设计代码,在许多方面会更好。