首页 > 解决方案 > 承诺对象总是需要回调函数吗?

问题描述

我有一个要求,我需要在 Angular 1 中创建一个服务,并使用可以在控制器中访问的 API 调用加载数据。我之前尝试过使用 $http 服务进行 API 调用并将数据分配给变量/对象。然后我注入服务并将变量/对象分配给控制器范围变量/对象。

我在控制器事件循环中观察到的与服务事件循环不同,控制器范围变量/对象仍未定义。后来我通过从服务返回一个promise,并在控制器中调用promise,得到了一个解决方案,但是我是promise的新手,当我调用promise时无法完全吸收,我必须将函数传递为我认为这是 $http API 调用的回调,但我不确定它是如何在后台工作的。有人可以解释一下吗?

//service code
this.getuserimages = function(uname) {
    console.log("Username in UserImage Service: " + uname);
    var promise = $http.get('/api/images/' + uname).then(function(response) {
        this.userimages = response.data;
        return this.userimages;
    });
    return promise;
}

// controller code        
var userimagespromise = userImageService.getuserimages($routeParams.username);
userimagespromise.then(function(data) {
            $scope.userimages = data;

标签: promise

解决方案


您的代码是一个Promise 链

我以一种更清晰的方式重写了您的代码,但含义完全相同:

$http.get('/api/images/' + uname)
.then(function(response) {
    this.userimages = response.data;
    return this.userimages;
})
.then(function(images) {
    $scope.userimages = images;
});

您可以通过以下方式阅读此流程:

  • 请给我用户图片
  • 然后,我们它们可用(=> 从 get 返回并传递给then函数),将它们保存在变量中并将它们返回到链的下一个元素
  • 然后,我们它们可用(=> 从先前的承诺返回),将它们设置在$scope

请注意,整个流程是异步的,因为每个 Promise 都是“代表异步操作最终完成或失败的对象”。

您可以在Promise 文档中找到更多信息。


推荐阅读