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

标签 javascript node.js asynchronous q

使用 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());

关于javascript - 使用 Q/promises/异步函数时,如何将值从一个类方法返回到另一个类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444230/

相关文章:

javascript - 单击打开卡以显示更多详细信息

javascript - 环境变量更改project.json中的应用程序名称并设置运行时变量?

node.js - 无法在 Windows 10 上安装 NPM 依赖项

asynchronous - 如何为通过 Spring DelegatingFilterProxy 链调用的过滤器设置异步支持标志?

javascript - 如何为 react-table 组件添加 ID?

javascript - 在 CSS 转换期间触发事件

javascript - 将数组传递给js中的对象

node.js - NPM 安装无法与代理周围的 Artifactory 一起使用

c# - ApiController Post 中的异步和等待

xcode - 使用 NSURLSession 处理异步模式