angularjs – 使用带有“then”函数的对象解析promise
这是一个抽象的问题,因为我现在没有特定的用例.我注意到如果你以承诺解决了承诺
var deferredA = $q.defer(); var deferredB = $q.defer(); deferredA.promise.then(function(result) { // Will get here once promiseB has been resolved. }); deferredA.resolve(deferredB.promise); 在promiseB已经解决之前,promiseA实际上并未解决(然后使用promiseB的解析值解析promiseA).但是,如果我想使用“then”函数解析对象的值,如下所示: var deferred = $q.defer(); deferred.promise.then(function(result) { // Aim is to get here with result = {then:function(){}},// as though I had resolved a promise with a non-promise value,// but this function is never called }); deferred.resolve({ then: function() { } }); 然后,promiseA从未实际得到解决,因为它假设值是一个promise,即使在上面的例子中它不是,因为它不是用$q.defer()创建的.有一个例子plunkr在 http://plnkr.co/edit/Z8XUKzxHtGBKBmgPed2q?p=preview 有没有解决的办法?如果是这样,怎么样? 编辑:澄清推迟/承诺&放入示例“then”回调. 解决方法
解
您传入的then属性将覆盖promise的then属性.你想要从角度承诺的成功回调中返回你的对象然后像这样的函数: $scope.resolvePromise2 = function() { deferred2.resolve({ then: function(successCB) { successCB({myResult1:'result1',myResult2:'result2','then':function() {console.log("got here")}}); } }); }; 现在调用上面的消息,您可以调用属性中的then函数: promise2.then(function(result) { //Now we get here $scope.messages2.push('Promise 2 then callback. Result is:' + result); result.then(); }); 这是您更新的working plunker. 问题/为什么这样工作让我们看看Angular resolve: function(val) { if (pending) { var callbacks = pending; pending = undefined; value = ref(val); if (callbacks.length) { nextTick(function() { var callback; for (var i = 0,ii = callbacks.length; i < ii; i++) { callback = callbacks[i]; value.then(callback[0],callback[1],callback[2]); } }); } } }, 看看value = ref(val);接下来是value.then(callback [0],callback [1],callback [2]);我们看到Angular将then函数作为属性附加到promise,并且您传入的对象会覆盖该属性.所以,在你的情况下,调用传入的函数而不是deferred.promise.then(函数(结果)…. 但Angular使用三个回调调用你的then函数(success,error,notify):value.then(callback [0],callback [2]);在var callbacks = pending中保存的; 因此,解决方案是在then函数中调用第一个“success”回调函数,并将对象(包括要返回的then属性)传递给它.现在,承诺将被调用并接收您的对象,包括您的then属性 then: function(successCB) { successCB({myResult1:'result1','then':function() {console.log("got here")}}); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |