2017-04-11 57 views
3

我有一个函数,它接受一个名为issue的对象,然后调用一个promise。在执行承诺之前对对象引用做出的任何更改都将反映在原始引用中。之后所做的任何更改都不是。为什么不能,我该如何解决?为什么我的对象在承诺后失去参考?

下面这个例子说明了当你调用

issues.add_comment(issue); 

该功能与

return o.update(comment).then(... 

其立即返回一个承诺,then()已执行未结束后的问题

angular.module('app').controller('IssueCtrl',['issues', function(issues){ 
    var issue = {}; 
    issue.id=1; 
    issues.add_comment('test', issue).then(function(issue){ 
     console.log(issue.id); 
    } 
    // returns 'a' 
} 
]); 


angular.module('app').factory('issues', function(){ 
    o.add_comment = function (comment, issue) { 
     // Changes made before promise are reflected in original promise 
     issue.id='a' 
    return o.update(comment).then(function(new_comment){ 
     // Changes made after promise are not reflected in original promise 
     issue.id = 'b' 
     return new_comment 
    } 

    o.update=function(){ 
     // more code 
    } 
return o; 
}); 
+0

承诺是异步的,你访问'它改变 –

+0

之前issue'你不能用'console.log'解决异步代码;在这种情况下,对'console.log(issue.id)'的调用不会被promise阻塞,所以在promise被调用之后立即输出,然后promise会返回并更新数据。 – Claies

+0

忘记在代码示例中包含此代码,编辑 – user7422859

回答

1

。如果你想等待,你在原来的通话这样做:

issues.add_comment(issue).then(.... 
+0

对不起,我在对代码进行下采样时忘记了包含该代码。现在编辑,我确实有一个then()函数 – user7422859

1

这里的问题是,在你的控制线:

issues.add_comment('test', issue).then(function(issue){ 
    console.log(issue.id); 
} 

该服务将返回一个承诺对象,并最终new_comment。您正在覆盖功能签名中的原始issue。尝试这样的事情,而不是:

issues.add_comment('test', issue).then(function(resp){ 
    console.log('inside then', issue.id); 
    console.log('then response', resp); 
}) 

Working Example