使用 Q/promises/asynchronous 函数时,如何 return 从一个 class 方法到另一个方法的值?

How do you return a value from one class method to another when using Q/promises/asynchronous functions?

在使用 Q/promises/asynchronous 函数时,将一个 class 方法的值 return 转换为另一个 class 方法的最佳方法是什么?

具体来说,我有以下内容,其中 ClassOne.myMethod() 将调用 ClassTwo.test() 来执行多个异步任务(数据库更新、文件写入等)。我想要 ClassTwo.test() 到 return 一些东西(在这个例子中,"FOUR")。使用 promises 和异步调用时我该怎么做?

我这样做是因为我希望 ClassTwo 是一组非常通用的方法,用于执行将由其他 classes 调用的任务(以免每次都重新发明轮子)。

例如,

var myClass = new ClassTwo();

ClassOne.prototype.myMethod = function(myClass) {
  console.log('Returns: ', myClass.test());        
};


ClassTwo.prototype.test = function() {

  var one = function() {
    var deferred = Q.defer();
    console.log('ONE');
    deferred.resolve();
    return deferred.promise;
  };

  var two = function() {
    var deferred = Q.defer();    
    console.log('TWO');
    deferred.resolve();
    return deferred.promise;
  };

  var three = function() {  
    var deferred = Q.defer();    
    console.log('THREE');
    deferred.resolve();
    return 'FOUR';    
  };

  return one()
      .then(two)
      .then(three);

};

我认为您正在寻找类似以下的内容。请注意,我已将所有对 deferred.resolve() 的调用包装到异步函数的回调中(在本例中为 process.nextTick),因为这将是一个更现实的用例,然后在返回它之前解析承诺,并且是的,我假设你会用你的异步任务做什么。您还声明了一个变量 'myClass' 并使用相同的标识符作为 'myMethod' 的函数参数。我认为这不是您真正想要做的,所以我在下面的示例中进行了更改.

var ClassTwo = function() {};
var ClassOne = function() {};
var Q = require('q');

ClassOne.prototype.myMethod = function(myClass) {
  myClass.test().then(function(result) { // now test returns a promise
      console.log('returns '+ result);   // that we call .then() on
  });
};


ClassTwo.prototype.test = function() {

    var one = function() {
        var deferred = Q.defer();
        console.log('ONE');
        process.nextTick(function() { deferred.resolve()});
        return deferred.promise;
    };

    var two = function() {
        var deferred = Q.defer();
        console.log('TWO');
        process.nextTick(function() { deferred.resolve()});
        return deferred.promise;
    };

    var three = function() {
      var deferred = Q.defer();
      console.log('THREE');
      process.nextTick(function() { deferred.resolve('FOUR')});
      return deferred.promise;
   };

    return one()
        .then(two)
        .then(three)
};

(new ClassOne()).myMethod(new ClassTwo());