我试图通过让我的服务解析一个自动将对象绑定到我的范围的promise调用来重构我的AngularJS代码。
__init__.py
我正在尝试重构的当前解决方案是:
// converting this:
imageService.getImages(userId)
.then(images => {
$scope.images = images;
});
// into this:
$scope.images = imageService.getImages(userId);
我开始玩function getImages(userId) {
const config = {
method: 'get',
url: '/a/images',
params: { userId: userId }
};
return $http(config).then(onGetImagesSuccess, onGetImagesError);
}
function onGetImagesSuccess(response) {
$log.info('Get image success', response);
return response.data;
}
function onGetImagesError(response) {
$log.info('Get image error', response);
}
,我的$q.defer()
得到了以下状态。问题是我getImages()
返回Promise而不是图像。有趣的是,图像列表确实被记录下来。
imageService.getImages()
我想知道我需要做些什么来重构我的代码以使我的function getImages(userId) {
const deferred = $q.defer();
const config = {
method: 'get',
url: '/a/images',
params: { userId: userId }
};
let call = $http(config).then(onGetImagesSuccess, onGetImagesError);
deferred.resolve(call);
return deferred.promise.then(images => {
$log.info(images); // List of images does get logged
return images; // Promise gets returned instead of the actual images
});
}
返回图像列表而不是Promise。
答案 0 :(得分:0)
这可以通过$resource
中使用的相同配方来完成。返回空对象(数组),它以异步方式填充数据。如果需要知道请求何时以及如何完成,也应该返回一个承诺:
var result = {
data: [],
promise: $http(...).then(response => {
return Object.assign(result.data, response.data);
})
};
return result;
然后在视图中绑定imageService.data
数组。
这种模式有其优点和缺点。控制器中有then
来解开承诺是很自然的。