javascript - 如何将 promise 传递给 AngularJS 中的 Controller

标签 javascript angularjs promise angular-promise

我无法理解 promise 。我有一个函数 $scope.startJob,调用它时,它会调用 SegmentsService 中的 areThereAvailableSegments。我的想法是 areThereAvailableSegments 应该返回 true 或 false,这样我就可以在 Controller 中处理这种行为,但不确定如何做到这一点。

areThereAvailableSegments 调用 getSegments(),它从数据库请求文本段。 getSegments 返回一个 promise ,我试图用 .thenareThereAvailableSegments 中处理这个 promise ,但不确定如何传递给 Controller .

这是我的 Segments 工厂,它返回 $resource 对象,segmentsfactory.js:

angular.module('appApp')
  .factory('SegmentsFactory', function ($resource) {
    return $resource('http://localhost:3000/api/v1/segments/:id');
  });

这是我的 Segments 服务,segmentsservice.js:

angular.module('appApp')
  .service('SegmentsService', function (SegmentsFactory) {

    // gets segments from mongo
    this.getSegments = function(jobId) {
      return SegmentsFactory.query({ job_id: jobId }).$promise;
    };

    // should return true/false if there are available segments
    this.areThereAvailableSegments = function(jobId) {
      var dump = [];

      // queries for all segments
      this.getSegments(jobId)
      .then(function(segments) {
        // dumps segments status in a temp array
        for (var i = 0; i < segments.length; i++) {
          dump.push(segments[i].status);
        }
        // returns true if there is an 'available' in the temp array
        if (dump.indexOf('available') >= 0) {
          return true;
        } else {
          return false;
        }
      });
    };

  });

这是我的 Controller ,main.js:

$scope.startJob = function() {

  if (SegmentsService.areThereAvailableSegments(jobId)) {
    console.log('there are available segments, then trigger texteditor');
  } else {
    console.log('no segments to translate');
  }
};

执行时,控制台显示“没有要翻译的段”,因为 SegmentsService 没有返回 true 或 false。

如何解决?

最佳答案

areThereAvailibleSegments 函数也应该返回一个 promise 。 然后在你的 Controller 中你有一个 then case 并且在那里有你的 if-else。

this.areThereAvailableSegments = function(jobId) {
      var dump = [];

      // queries for all segments
      return this.getSegments(jobId) //Return here
      .then(function(segments) {
        // dumps segments status in a temp array
        for (var i = 0; i < segments.length; i++) {
          dump.push(segments[i].status);
        }
        // returns true if there is an 'available' in the temp array
        if (dump.indexOf('available') >= 0) {
          return true; 
        } else {
          return false;
        }
      });
    };

由于您的成功函数返回 true 或 false,areThereAvailibleSegments 的 promise 将具有该 bool 值。

然后在你的 Controller 中:

SegmentsService.areThereAvailableSegments(jobId).then(function(available){
  if (available) {
      console.log('there are available segments, then trigger texteditor');
    } else {
      console.log('no segments to translate');
    }
});

关于javascript - 如何将 promise 传递给 AngularJS 中的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143244/

相关文章:

javascript - 如何以响应方式创建水平元素?

javascript - 当开发人员工具打开 IE11 时,网站的行为有所不同

javascript - 计算字符串中字符的出现次数

angularjs - 如何在 WebStorm 的调试器中调试 AngularJS(Angular 1.x)/Gulp 应用程序,以便客户端 JS 断点在 WebStorm 中工作?

angularjs - 如何在 Angular js 中动态构建页面

javascript - 允许在 ng-pattern 正则表达式中使用正斜杠。

javascript - 用于按顺序排列项目的替代输入控件

Javascript Promise 拒绝后显式返回

javascript - 如何使用 RXJS 动态链接函数调用?

node.js - 循环后 Node/mongo响应