当使用Q/promises/异步函数时,如何将一个值从一个类方法返回到另一个类

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

本文关键字:一个 类方法 另一个 返回 promises 异步 函数      更新时间:2023-09-26

当使用Q/promises/异步函数时,将一个类方法中的值返回到不同的类方法的最佳方式是什么?

具体来说,我有以下内容,其中ClassOne.myMethod()将调用ClassTwo.test()来执行几个异步任务(数据库更新、文件写入等)。我希望ClassTwo.test()返回一些东西(在本例中为"FOUR")。在使用promise和异步调用时如何做到这一点?

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

例如,

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),因为这将是一个更现实的用例,然后在返回promise之前解析它,我假设您将如何处理异步任务。此外,您还声明了一个变量"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());