gpt4 book ai didi

javascript - 简化使用 $q.defer() promise 链接的 Angular 函数

转载 作者:行者123 更新时间:2023-12-03 05:44:13 24 4
gpt4 key购买 nike

我想简化以下 AngularJs 代码,特别是 $q.defer()promise 方法。

我看到一篇博客给出了一些错误使用 $q.defer() here 的示例,并且非常感谢您在重写下面的代码以符合这种更简单的方法时提供的意见和提示。

This is an example from the Blog:

This:

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

can be changed to:

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

下面是来自 3 个不同服务的 3 个函数(在本例中我们称之为“阶段”),用于返回适当的数据:

第一阶段: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 阶段:GetDataService

.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;

}

最佳答案

一般来说,如果您已经在函数中使用了一个 Promise,那么您应该省略 $q.defer 并利用 Promise 链。

我将为您的第 1 阶段举一个例子:

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

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

我们在这里使用的是,您只需在 .then 函数回调中使用“return”,它将在内部解析 .then 返回的 Promise。这就是为什么我们可以在主函数中返回链式 Promise 而不是 $q.defer() 。

加法:像这样看:您在 .then 回调中返回的任何值都将被包装到 Promise.resolve 中。这将根据该值创建一个 promise (当它还不是一个时)。

关于javascript - 简化使用 $q.defer() promise 链接的 Angular 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com