我已经阅读了 Kris Kowal 的 Q 和 angularjs $q 变量几个小时了。但对于我的一生,我无法弄清楚这是如何运作的。
目前我的服务中有以下代码:
resetpassword: function (email, oldPassword, newPassword) {
var deferred = $q.defer(); //Why am I doing this?
var promise = auth.$changePassword(email, oldPassword, newPassword); //$changepassword in angularfire returns a promise
console.log(deferred); //Object with resolve, reject, notify and promise attrs
var rValue = promise.then(function(){
//successcallback
return 1; //if changepassword succeeds it goes here as expected
}, function(error){
//errorcallback
return error.code; //if changepassword fails (wrong oldpass for example) it goes here, also works
}
);
deferred.resolve(promise); //Should I do this? I thought my promise was resolved in the callbacks?
console.log(rValue); //This outputs another promise? Why not 1 or error.code, how the am I ever going to get these values??
return rValue; //I want 1 or error.code to go back to my controller
},
最佳答案
var deferred = $q.defer(); //Why am I doing this?
这是 deferred anti-pattern你之所以这样做是因为你不理解 promise 。实际上,在应用程序逻辑中使用 $q.defer()
从来都没有充分的理由。
您需要从函数返回一个 promise :
resetpassword: function(email, oldPassword, newPassword) {
return auth.$changePassword(email, oldPassword, newPassword)
.then(function() { return 1; })
.catch(function(e) { return e.code });
}
用法是:
resetpassword(...)
.then(function(num) {
if (num === 1) {
}
else {
}
});
<小时/>
这有助于思考如何用同步代码编写函数:
resetpassword: function(email, oldPassword, newPassword) {
try {
auth.$changePassword(email, oldPassword, newPassword)
return 1;
}
catch (e) {
return e.code;
}
}
关于javascript - 关于 $q 和 Promise 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23387928/