2016-03-30 9 views
0

こんにちは私はPromise Chainingを実装しようとしています。以下の私の角型プロジェクトでq-libraryを使用しています。私の2つのメソッドとそれらがチェーンされている方法は私の問題を理解するメソッド実装です。今度はpathUserDataFromAuthServiceメソッドで、私は最初の約束で設定した値、すなわちgetUserDataFromAuthServersetEtag()メソッドを使用してアクセスしたいと思っています。問題はgetEtag()メソッドが最初の約束データが解決される前に呼び出されます。正しいのEtag値を確保する方法をPromise Chaining

は、この点で任意のヘルプは

getUserDataFromAuthServer(user) 
      .then(pathUserDataFromAuthService(user)) 

素晴らしいことだとメソッドのコードは

getUserDataFromAuthServer = function(user){ 
        var defer=$q.defer(); 
        $http.get(autherizationURL+'/'+'api/users/'+user.username) 
        .then(function(response){ 
         var ETag =response.headers().etag; 
         console.log("etag"+ETag) 
         setEtag(ETag) 
         console.log("Etag Set changed"); 
         defer.resolve(response.data); 
        },function(error){   
          defer.reject(error.statusText); 
        }); 
        return defer.promise;  
       }; 



      var pathUserDataFromAuthService = function (user){  
       var defer=$q.defer(); 
       var passwordtobesaved ={ 
         "firstName": user.firstName, 
         "lastName": user.lastName 
        }; 
       var tag = getEtag(); 
      $http.put(autherizationURL+'/'+'api/users/'+user.username,passwordtobesaved,{ 
        headers:{ 
         "If-Match": tag 
        } 
       }).then(function(response){ 

        defer.resolve(response.data); 
       },function(error){   
         defer.reject(error.statusText); 
       }); 
       return defer.promise;  
      }; 
+1

まず、[遅延反パターンを避ける](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+1

あなたはコールバック*関数*を '約束'(関数呼び出しの結果)ではなく 'then'に渡す必要があります – Bergi

答えて

1

不要に以下の通りです

まで来ています遅延を使用する、これは反パターンです。 httpリクエストを返すことで、約束を伝えることができます。

はここでどのようにすべきだ。それが終了したときに、あなたが何もしないので、それが必要なのは、なぜ私は表示されませんが、

getUserDataFromAuthServer = function(user){ 
    return $http.get(autherizationURL+'/'+'api/users/'+user.username) 
     .then(function(response){ 
      var ETag =response.headers().etag; 
      console.log("etag"+ETag) 
      setEtag(ETag) 
      console.log("Etag Set changed"); 
      return response.data; 
     } 
}; 

同じことが、あなたの第二の機能で行うことができます。

var pathUserDataFromAuthService = function (user){  
    var passwordtobesaved ={ 
    "firstName": user.firstName, 
    "lastName": user.lastName 
    }; 
    var tag = getEtag(); 
    return $http.put(
    autherizationURL + '/' + 'api/users/' + user.username, 
    passwordtobesaved, 
    { headers: { "If-Match": tag } } 
) 
}; 
+0

私は最初のリクエストからEtagを使用しています。オブジェクトにオプティミスティックロックを作る –

+0

私は第2の関数も追加しました –

+1

あなたは 'throw error.statusText'を使用しなければならないでしょう(それでも/ throwing文字列で拒否することは反パターンであっても) – Bergi

0

すでに指摘したように、主な問題は、then()機能(複数可)を受け入れることです。

その後、userを渡す必要がありますが、少し面倒ですが、javascriptで対応できないものはありません。

多くのアプローチが可能です。ここに2つあります。

  • user.bind()

    の助けを借りて、別途

    1.パスuseretagは、これは2つのパラメータuseretagは異なるメカニズムによって渡されるので、これはどのように働くか多分明白ではありません: "バインドされている"

  • etag:返された関数.bind()
getUserDataFromAuthServer(user).then(pathUserDataFromAuthService.bind(null, user)); 

getUserDataFromAuthServer = function(user) { 
    return $http.get(autherizationURL + '/api/users/' + user.username).then(function(response) { 
     return response.headers().etag; 
    }); 
}; 

var pathUserDataFromAuthService = function(user, etag) { 
    return $http.put(autherizationURL + '/api/users/' + user.username, { 
     "firstName": user.firstName, 
     "lastName": user.lastName 
    }, { 
     headers: { "If-Match": etag } 
    }).then(function(response) { 
     return response.data; 
    }); 
}; 

2でこれはおそらく、より直感的である単一のオブジェクト

のプロパティとしてuseretagを提供します。約束チェーンは、pathUserDataFromAuthServiceに1つのオブジェクトをdataとして配信します。両方のソリューションsetEtag()/getEtag()

getUserDataFromAuthServer(user).then(pathUserDataFromAuthService); 

getUserDataFromAuthServer = function(user) { 
    return $http.get(autherizationURL + '/api/users/' + user.username).then(function(response) { 
     return { 
      user: user, 
      etag: response.headers().etag 
     }; 
    }); 
}; 

var pathUserDataFromAuthService = function(data) { 
    return $http.put(autherizationURL + '/api/users/' + data.user.username, { 
     "firstName": data.user.firstName, 
     "lastName": data.user.lastName 
    }, { 
     headers: { "If-Match": data.etag } 
    }).then(function(response) { 
     return response.data; 
    }); 
}; 

彼らは単にETagを渡すためのメカニズムとして、(問題の)存在することを前提に消えます。他の理由(例えば、副作用)のために必要であれば、結果を出さずに再導入することができます(投げない限り)。

+0

ありがとうございました –