【问题标题】:How do you return a value from one class method to another when using Q/promises/asynchronous functions?使用 Q/promises/asynchronous 函数时,如何将值从一个类方法返回到另一个类方法?
【发布时间】:2015-04-11 05:26:21
【问题描述】:

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

具体来说,我有以下 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);

};

【问题讨论】:

  • 你可以在解析promise时传递值,如deferred.resolve('something', 'else');
  • 谢谢,Adeneo。除了 Mike 在下面的评论之外,您的评论是我理解如何实现这一点所需要的。非常感谢。

标签: javascript node.js asynchronous q


【解决方案1】:

我认为您正在寻找类似以下的内容。请注意,我已将对 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());

【讨论】:

  • 谢谢,迈克。这是我一直在寻找的答案。您的回复非常有帮助、及时且易于理解。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2019-09-28
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多