2016-11-03 7 views
0

AngularJsコード、特に$q.defer()およびpromiseメソッドを簡略化したいと思います。

$q.defer()hereの間違った使い方の例を示すブログを見ました。この簡単な方法に準拠するために、以下のコードを書き直していただきたいと思います。

これはブログの例である:

これ:

return $http.get('options.json').then(function(response) { 
    return response.data; 
}); 

var defer = $q.defer(); 
$http.get('options.json').success(function(result) { 
    defer.resolve(result); 
}); 
return defer.promise; 

に変更することができます以下は

3つの機能の適切なデータを返すために、3種類のサービスから(この例では、 "ステージ" それを呼び出すことができます)です:

ステージ1:SocialMediaUserService

this.checkSocialMediaSubscription = function() { 

    var isSubscribed = $q.defer(); 

    GetUserAccessService.returnBrandProfileID().then(function (brandProfileID) { 

     if (brandProfileID === 0) { 
      isSubscribed.resolve(false); 
     } 

     else { 
      isSubscribed.resolve(true); 
     } 
    }); 

    return isSubscribed.promise; 
}; 

ステージ2: GetUserAccessService

this.returnBrandProfileID = function() { 

    var brandProfileID = $q.defer(); 

    if (angular.isUndefined($sessionStorage.brandProfileID)) { 

     GetDataService.getItems('GetUserAccess/' + $cookies.get('authenticationID')) 

     .success(function (accessObject) { 

      $sessionStorage.brandProfileID = accessObject.FusewareID; 
      brandProfileID.resolve(accessObject.FusewareID); 
     }) 

     .error(function (error, status) { 
      console.error('Fuseware API error: ' + error + ' Status message: ' + status); 
     }); 
    } 

    else { 
     brandProfileID.resolve($sessionStorage.brandProfileID); 
    } 

    return brandProfileID.promise; 

}; 

ステージ3:GetDataS ervice一般に

.factory('GetDataService', ['$http', 'WebServiceURL', function ($http, WebServiceURL) { 

    var DataFactory = {}; 

    DataFactory.getItems = function (ServiceParameter) { 

     console.log(WebServiceURL + '/' + ServiceParameter); 

     return $http.get(WebServiceURL + '/' + ServiceParameter, { cache: true }); 

    }; 

    return DataFactory; 

    } 
+1

Tobiは既に述べたことに加えて、以下のような約束を連想させるライブラリを確認することができます:https://github.com/kriskowal/qまたはhttps://github.com/petkaantonov/bluebird –

+0

参考にしていただきありがとうございます! – onmyway

答えて

1

あなたはすでにあなたの代わりに連鎖する機能と、レバレッジの約束で作業している約束を持っている場合は、$ q.deferを省略しなければなりません。

私はあなたのステージ1のための例をあげる:

function() { 
    return GetUserAccessService.returnBrandProfileID().then(function (brandProfileID) { 

     if (brandProfileID === 0) { 
      return false; 
     } 
     else { 
      return true; 
     } 
    }); 
} 

私たちはここに使用すると、あなただけの内部で返された約束を解決します.then関数コールバックの内側に「復帰」を使用することができるということです.then。これがmain関数で$ q.defer()の代わりに連鎖した約束を返すことができる理由です。

追加:このようにそれを見て:それはすでにないとき、あなたは.thenコールバックの内側に返す任意の値がPromise.resolveにラップされ、この値に基づいて約束を作成します。

関連する問題