代码之家  ›  专栏  ›  技术社区  ›  RT01

当使用Q/promise/异步函数时,如何从一个类方法向另一个类返回值?

  •  0
  • RT01  · 技术社区  · 10 年前

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

    具体地说,我有以下内容:ClassOne.myMethod()将调用ClassTwo.test()来执行几个异步任务(数据库更新、文件写入等)。我希望ClassTwo.test()返回一些东西(在本例中为“四”)。在使用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);
    
    };
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Mike Atkins    10 年前

    我想您正在寻找以下内容。请注意,我已经将所有对deferred.resolve()的调用包装为异步函数的回调(在本例中为process.nexTick),因为这将是一个比在返回之前解析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());