【发布时间】:2018-01-10 23:50:26
【问题描述】:
我试图通过让我的服务解析一个承诺调用来重构我的 AngularJS 代码,该调用会自动将一个对象绑定到我的范围。
// 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() 进入以下状态。问题是我 imageService.getImages() 返回一个 Promise 而不是图像。有趣的是,图像列表确实会被记录下来。
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
});
}
我想知道我需要做什么来重构我的代码以使我的imageService.getImages() 返回图像列表而不是 Promise。
【问题讨论】:
-
Promise gets returned instead of the actual images- 是的,它总是会的,因为 Promise 链总是导致 Promise ...你不能让异步结果同步返回(这是你试图做的) -
您正在发出异步请求。你没有办法按照你的要求去做。为什么要更改代码?
-
我只是想通过将更多逻辑从我的控制器转移到我的服务中来重构我的代码。我希望一旦 Promise 得到解决,服务会将结果返回给我的控制器,而无需我调用
then()。 -
“无需我打电话”听起来你想移动到 async/await then :)... 或者回到回调 HA
-
旧但说明性的embed.plnkr.co/bx8eGvIFWhqdzCqpB7fb(注意你需要try/catch...)
标签: javascript angularjs angular-promise q