javascript - 关于 $q 和 Promise 的困惑

标签 javascript angularjs promise q angularfire

我已经阅读了 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/

相关文章:

node.js - OpenWhisk/Node —— Promise 未解决

javascript - 在输入框旁边显示错误而不是 JavaScript 中的 alert()

javascript - 无论旋转如何获取元素尺寸

javascript - AngularJS 1.0.7 中使用 $http 嵌套 Promise

javascript - AngularJS的http服务总是返回错误

javascript - 使用指令绑定(bind) angularjs 中的自定义事件

javascript - 有条件的 promise 链

http - 错误 TS2346 : Supplied parameters do not match any signature of call target

javascript - 如何在 Bing Maps 7 中将类添加到图钉?

javascript - 在 Promise 或 Callbacks (JavaScript ES6) 中处理此问题的正确方法