AngularJS服务返回一个对象而不是一个承诺

时间:2018-01-10 23:50:26

标签: javascript angularjs angular-promise q

我试图通过让我的服务解析一个自动将对象绑定到我的范围的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。

1 个答案:

答案 0 :(得分:0)

这可以通过$resource中使用的相同配方来完成。返回空对象(数组),它以异步方式填充数据。如果需要知道请求何时以及如何完成,也应该返回一个承诺:

var result = {
  data: [],
  promise: $http(...).then(response => {
    return Object.assign(result.data, response.data);
  })
};

return result;

然后在视图中绑定imageService.data数组。

这种模式有其优点和缺点。控制器中有then来解开承诺是很自然的。