首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JS Promises - Angular -可以在任何函数上使用吗?

JS Promises - Angular -可以在任何函数上使用吗?
EN

Stack Overflow用户
提问于 2016-05-10 22:47:21
回答 4查看 121关注 0票数 1

我想问一下,then()可以在任何函数上使用吗?

在我的Angular应用程序中,当我尝试使用then时,我看到一个错误('cannot read property then of undefined')。

例如,我有这个函数:

代码语言:javascript
运行
复制
self.getCommentsData = function() {
  commentsService.getComments($routeParams.id)
  .then(function (data){
    //Do some stuff and at the end push to a scope array
    $scope.commentsList.push(someValue);
  });
}

稍后,我想调用此方法,然后(也只有在那时)在完成后调用另一行代码,也就是我使用的then

代码语言:javascript
运行
复制
self.getCommentsData()
      .then(function(){
        $location.hash('goTotrue');
        $anchorScroll();
});

这给了我一个错误--想知道我做错了什么吗?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2016-05-10 22:48:43

您应该在链的函数中返回promise

代码语言:javascript
运行
复制
self.getCommentsData = function() {
  return commentsService.getComments($routeParams.id)
  .then(function (data){
    //Do some stuff and at the end push to a scope array
    $scope.commentsList.push(someValue);
  });
}
票数 3
EN

Stack Overflow用户

发布于 2016-05-10 22:53:30

.then()不能用于任何函数。仅返回某种形式的Promise的函数。

我会使用$q在Angular中查看PromisesPromise.prototype.then和Promises上的MDN文档。

在本例中,只有commentsService.getComments($routeParams.id)返回Promise,因此可以对其调用.then()

commentsService.getComments($routeParams.id).then()还返回一个Promise,它在.then()块中的函数运行后解析,因此您可以简单地添加一个return来链接创建的Promise。它将与调用相同:

代码语言:javascript
运行
复制
commentsService.getComments($routeParams.id).then().then();

添加了return的代码:

代码语言:javascript
运行
复制
  self.getCommentsData = function() {
    return commentsService.getComments($routeParams.id)
      .then(function (data){
        //Do some stuff and at the end push to a scope array
        $scope.commentsList.push(someValue);
      });
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-10 23:46:39

你需要返回一个promise,如果你不这样做,这个错误仍然会出现。如果您看到angular documentation,您可以找到以下内容:

延迟对象的目的是公开关联的Promise实例以及可用于通知成功或不成功完成以及任务状态的API

为了说明这一点,我制作了以下代码片段:

代码语言:javascript
运行
复制
angular
  .module("myApp", [])
  .controller("myCtrl", myCtrl)
  .service("myService", myService)
  
  myCtrl.$inject  = ["myService"];
  myService.$inject  = ["$q", "$timeout"];
  
  function myCtrl(myService){
    var vm = this;
    vm.data = [{user: "empty"}, {user: "empty"}, {user: "empty"}]
    vm.message = "Just wait 3 seconds to retrieve the data";
    
    myService.myPromise().then(function(res){
      //success case. The promise has been resolved
      vm.data = res;
      vm.message = "Promise resolved!";
      console.log("resultado");
      console.log(res);
    });
    
    
  }
  
  function myService($q, $timeout){
    this.myPromise = function(){
      var promiseObj = $q.defer(); //promise
      var dummyData = [{user: 1}, {user: 2}, {user: 3}];
      
      //this timeout is to ilustrate that the promise may take some time
      //you don't need to use the $timeout service
      $timeout(function(){
        promiseObj.resolve(dummyData); //promise resolved
      }, 3000);
      
      //promise resolved
      return promiseObj.promise;
      
    }
  }
代码语言:javascript
运行
复制
<!DOCTYPE html>
<html ng-app="myApp">

<head>
  <script data-require="angular.js@1.3.14" data-semver="1.3.14" src="https://code.angularjs.org/1.3.14/angular.js"></script>
  <link rel="stylesheet" href="style.css" />
</head>

<body ng-controller="myCtrl as ctrl">
  <h1>Promise test</h1>
  <h2>Dummy data</h2>
  <h4>{{ctrl.message}}</h4>
  <ul>
    <li ng-repeat="data in ctrl.data">{{data.user}}</li>
  </ul>
</body>

</html>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37141926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档