gpt4 book ai didi

Angularjs - 向作用域添加 promise 的最简洁方法,现在 Angular 弃用了自动解包 promise

转载 作者:行者123 更新时间:2023-12-04 17:19:41 25 4
gpt4 key购买 nike

我真的很喜欢 Promise 自动展开的干净(而且我认为很容易遵循)方式:

$scope.myData = DataService.query({something:"etc"}); // done;

而且我真的不关心现在似乎没有自动展开的标准方式:
DataService.query({something:"etc"}).$promise.then(function (data){
$scope.myData = data;
});

我想看到的是这样的:
$scope.pulseData = $scope.setPromise(CitsciAnalytics.pulse({
projId:"yardmap"
}));

但我看不出如何做到这一点。我得到的最接近的是:
$scope.pulseData = $scope.setPromise("pulseData", CitsciAnalytics.pulse({
projId:"yardmap"
}));

使用添加到根作用域的函数:
.run(["$rootScope", "$log", function ($rootScope, $log) {
//parent method to avoid promise unwrapping boilerplate
$rootScope.setPromise = function (scopeVar, promise) {
if (arguments.length === 2 && promise && promise.$promise) {
var scope = this;
promise.$promise.then(function (data){
scope[scopeVar] = data;
});
} else {
$log.error("$rootScope.setPromise has invalid arguments");
}
};
}]);

但我不喜欢必须将作用域变量名称作为附加字符串传递的 unDRY 要求。有没有其他人解决过这个问题,或者看到一种更干净的方法?

最佳答案

首先你不需要使用

DataService.query({something:"etc"}).$promise.then(function(data){
$scope.myData = data;
});

这清楚地指的是 $resource , 因为 $resource将返回一个空数组或对象,并在它们到达时用数据填充它。

所以,有了 $resource类,你仍然可以使用
$scope.myData = DetaService.query(...);
$resource的范式也是遵循您自己的“数据获取”服务的好方法:返回和空数组并在数据到达时用数据填充它。

例如。:
.factory('DataService', function ($http) {
function query(params) {
var data = [];
$http.get('/some/url/with/params').then(function (response) {
response.data.forEach(function (item) {
data.push(item);
});
});
return data;
}

return {
query: query
};
});

.controller('someCtrl', function ($scope, DataService) {
$scope.data = DataService.query({...});

如果您必须使用返回 promise 的第三方服务,您可以实现您的通用函数以提供类似的功能:
.run(function ($rootScope) {
$rootScope.promiseToArray = function (promise) {
var arr = [];
promise.then(function (data) {
data.forEach(function (item) {
arr.push(item);
});
});
return arr;
};
});

.controller('someCtrl', function ($scope, ThirdPartyService) {
$scope.data = $scope.promiseToArray(ThirdPartyService.fetchData());
});

另见此 short demo .


以上示例仅用于说明目的,而不是可用于生产的代码。
我是一个真实世界的应用程序,你需要优雅地处理异常、拒绝等。

关于Angularjs - 向作用域添加 promise 的最简洁方法,现在 Angular 弃用了自动解包 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24518212/

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