【问题标题】:AngularJS Service to Return an Object Instead of a PromiseAngularJS 服务返回一个对象而不是一个 Promise
【发布时间】: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


【解决方案1】:

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

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

return result;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多