2017-04-11 8 views
3

私はissueというオブジェクトを受け取り、約束を呼び出します。約束が実行される前にオブジェクト参照に加えられた変更は、元の参照に反映されます。それ以外の場合は変更されません。どうして私はそれを修正できますか?約束の後に私のオブジェクトが参照を失うのはなぜですか?

以下この例では、

issues.add_comment(issue); 

を呼び出すと、その関数がthen()が実行されていない後、すぐに約束を返し

return o.update(comment).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

約束は非同期であり、それはあなたが非同期コードのトラブルシューティングを行うには、 'console.log'を使用することはできません –

+0

を変更する前に、あなたは' issue'にアクセスします。この場合、 '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

関連する問題