2016-11-03 5 views
0

Я хотел бы упростить следующий код AngularJs, и в частности методи promise.

Я видел в блоге несколько примеров неправильного использования $q.defer()here, и был бы признателен за ваш ввод и советы по переписыванию моего кода ниже, чтобы соответствовать этому более простому методу.

Это пример из блога:

Это:

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

может быть изменен на:

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

Ниже 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 е р в

.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

В дополнение к тому, что Тоби уже сказал, вы можете проверить некоторые библиотеки, которые помогут вам с целыми обещаниями, такими как: 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. Вот почему мы можем вернуть цепочку обещаний вместо $ q.defer() в основной функции.

Добавление: смотреть на это так: Любое значение, вы возвращаетесь внутри .then обратного вызова будет обернут в Promise.resolve и это создаст обещание на основе значения, когда он уже не один.