2

私は現時点で約束を持って少し脳を持っています。次のコードを考える

$scope.getData = function(user) { 

    return $http.post('/endpoint', "some post data", { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) 
     .success(function (response) { 

      var myThing = { stuff: response.infoData }; 

      localStorageService.set('myData', { stuff: response.infoData }); 

      return myThing; 
    }); 
}; 

は成功コールバックから返されるmyThingオブジェクトです:

  • は$ scope.getDataメソッドの結果として返され、または
  • は無視され、どこにも失われませんか?

私が理解から:

  • $ http.postは約束ですので、それは非同期に解決してから成功メソッドが実行されたときに成功メソッド
  • を実行し、それがmyThingオブジェクトを返します。これは魔法の代わりに$ http.post promise全体を置き換えるものではありません

これは間違いありませんか?私が紛失しているものがあるか、成功の方法でオブジェクトを返すことに何らかの利益があるか、またはリターンが不必要なのでしょうか? (これはコードが改善できることをよく知っていますが、なぜ誰かがこれを書いたのか、それとも完全に間違いだったのかを特定しようとしています)

答えて

4

コールバックを$httpそこからデータを返すことができます。約束どおりにその能力を提供します。それが現時点で書かれている方法は、それがそうするようになるでしょう。 myThingのように、現在の実装では返されません(つまり、そこに余分なreturn文があります)。

誰かがこれを書いたのはなぜですか、それとも全く間違っていたのですか?

このメソッドを実装した人は誰でもデータを返そうとしていましたが、現在のコードを見れば成功したとは思いません。

To $httpメソッドによって返される約束を利用すれば、非同期呼び出しよりも約束のチェーンを形成できるようになります。そのためには.successメソッドの代わりに.thenを使用する必要があります。

$scope.getData = function(user) { 
    return $http.post('/endpoint', "some post data", { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) 
     .then(function (res) { 
      var response = res.data; 
      var myThing = { stuff: response.infoData }; 
      localStorageService.set('myData', { stuff: response.infoData }); 
      return myThing; 
    }); 
}; 

getDataメソッドを呼び出すことで、データを取得するためにあなたが本当に興味があれば、あなたはチェーンそれにによって返された約束の上に.then機能を置くべきgetData方法を消費できます。

$scope.getData().then(function(thing){ 
    console.log(thing); 
}) 

側注.success & error機能$http methods are deprecatedオーバー。

+0

ありがとうございますが、私は**具体的に**あなたが成功メソッド内でのリターンを呼び出す場合どうなるかを探しています。 (答えのサンプルコードでは、getDataは実際にmyThingを返しますか?これは成功の代わりにあなたが使っているからですか?それは約束とコールバックの代わりに約束のチェーンなので、これはですか?) –

+1

@HenryC私は更新された説明は答えについての明確化に役立つと思います..ありがとう:-) –

関連する問題