2017-07-30 6 views
-2

$ httpサービスを作成し、$ qを使用します。ここでなぜ私はhttpサービスから未定義になるのですか?

は私の$ HTTPサービスである:

function dashboardService($http, $log, $q, config) { 

    var service = { 
     getClientId: getClientIDByLayout, 
    }; 

    return service; 

    function getClientIDByLayout(layoutId) { 
     var deferred = $q.defer(); 
     return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) { 
      deferred.resolve(result.data); 
     }, function (result) { 
      deferred.reject(result); 
     }); 

     return deferred.promise; 
    } 
} 

そして、ここでは、私は、コントローラの内部で上記のサービスを呼び出す方法です:

dashboardService.getClientId(layoutId).then(function (data) { 
     var t = data;//undifined 
    }); 

しかし、私はこの行var t = dataで取得結果はundefinedです。

私はなぜサービスから定義されていないのですか?

答えて

3

基本的には、getClientIDByLayout関数内にreturn文が2つあり、両方ともpromiseを返しています。現在の実装では、拒否/解決を手動で管理する新しいpromise &を作成しています。しかし問題は、最初のreturn文(return $http.get()が他のreturn文(return deferred.promise)を冗長にしていることです。したがって、第1約束はコントローラからサブスクリプションに戻った。最終的には$http.getは何も返さないので、successCallbackにはundefinedが得られます。

次のように最初のreturn文を削除することで、この問題を簡単に修正できます。理想的にはアンチパターンとして考え約束のオーバーヘッドを作成

function getClientIDByLayout(layoutId) { 
    var deferred = $q.defer(); 
    //removed `return` from below code. 
    $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) { 
     deferred.resolve(result.data); 
    }, function (result) { 
     deferred.reject(result); 
    }); 
    //custom promise should get return 
    return deferred.promise; 
} 

、むしろあなたは$http.getによって返された約束を利用することができます。成功のコールバックからデータを返すだけで、約束を繋ぐことができます。

コード

function getClientIDByLayout(layoutId) { 
    ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶ 
    return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId) 
     .then(function (result) { 
     //returning data from promise, it will provide it to subsequent `.then` 
     return result.data; 
     }, function (error) { 
     ͟r͟e͟t͟u͟r͟n͟ $q.reject(error); 
     } 
    ); 
} 
1

代わりの.then方法でハンドラ関数に$q.defer、単にreturnまたはthrowを使用して:

function dashboardService($http, $log, ̶$̶q̶,̶ config) { 

    var service = { 
     getClientId: getClientIDByLayout, 
    }; 

    return service; 

    function getClientIDByLayout(layoutId) { 
     ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶ 
     return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) { 
      ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶r̶e̶s̶u̶l̶t̶.̶d̶a̶t̶a̶)̶;̶ 
      return result.data; 
     }, function (result) { 
      ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶j̶e̶c̶t̶(̶r̶e̶s̶u̶l̶t̶)̶;̶ 
      throw result; 
     }); 

     ̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶ 
    } 
} 

.then方法がある新しい約束を返します。 successCallbackの戻り値で解決または拒否されました。 errorCallback(その値が約束でない場合は、その約束で解決された値で解決されます。promise chaining)。 により1

誤っreturn又はthrow文がサービスundefinedとして解決約束を返した欠い機能を含まthen方法と約束を返します。

詳細については、You're Missing the Point of Promisesを参照してください。

関連する問題