javascript - Node.js、异步模块、并发

标签 javascript node.js asynchronous async.js

我是否最好避免一次使用异步模块功能的多个实例?

我的代码有三个部分要按顺序执行。我正在使用类似的代码

var async = require('async');
async.waterfall(
  [ function(cb) { part1(); },
    function(cb) { part2(); },
    function(cb) { part3(); }
  ],
  function(err, res) { console.log('Done'); }
);

part1() 也由三个部分组成。其中第三个在前两个之后运行。我的想法是使用

function part1(err, res) {
  async.waterfall(
    [ function(cb) {
        async.parallel(
          [ function(cb) { part1a(); },
            function(cb) { part1b(); }
          ]
        );
      },
      function(cb) { part1c(); },
      function(cb) {
        if (err) return err('part 1 error')
        return res()
      }
    ]
  );
}

在运行part1a和part1b的地方,我使用了异步的三个功能:外部 waterfall ,以及part1中的 waterfall 和并行。我重组了第 1 部分,只使用一个功能: waterfall 、第 1a 部分、第 1b 部分、第 1c 部分,只是为了让它正常工作。

我没有取得成功。例如,我还没有看到“完成”消息。当我重组part1时,我接到了part1a的电话,但没有接到part1b或任何其他电话。

也许我并不孤单。在 Optional callback not being called in the node.js async module's forEachOf method ,@LuisDelgado 表示,“作为个人说明,到目前为止,我还没有成功地让异步与本身具有内部回调异步函数的函数完美配合。”

Complicated use case for Node.js Async Module 、@Robbie 和 @dark_shadow 在 async.auto 方面取得了一些成功。我想这将涉及通过将三个外层函数分解为它们的组件并从外层调用每个组件来扁平化我的代码。也许这就是“JavaScript 方式”!

什么是正确的?

提前致谢...

编辑:干得好,亚当·萨克斯。非常感谢!后续...

编辑:亚当和其他人提出了 promise 。 Adam 喜欢 bluebird,并展示了一些有用的语法。我对蓝知更鸟有意见,尽管它很吸引人。我在这里发布了一个后续的 bluebird 问题。通过此编辑,我将删除该后续问题,将此问题(如标题所示)保留为异步问题。

对于那些鼓励我使用 Promise 的人,谢谢!请参阅node.js, bluebird, poor control of execution path .

异步问题仍然存在:我是否最好避免一次使用异步模块功能的多个实例?

最佳答案

您可能想尝试使用Promises用于这种异步操作的编排。 Promise 现在是 Nodejs 和较新浏览器的原生 JS 功能。还有大量的 Promise 库。我最常用的之一是 bluebird它有一些很棒的实用函数和额外的 Promise 糖分。

对于您的示例,您将拥有类似以下内容:

part1()
    .then(part2)
    .then(part3)
    .then(part4)
    .then(function() {
         console.log("Done!");
    });

function part1a() {
   return new Promise(function(resolve, reject){
     setTimeout(resolve, 1000);
   })
}

function part1() {
     return Promise.all([
         part1a(),
         part2b();
     ]);
}

关于javascript - Node.js、异步模块、并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837356/

相关文章:

javascript - 谷歌地图在ajax上成功

javascript - 提交隐藏表单字段

javascript - 解析 Javascript 数组

node.js - 将 Node 模块 SSH2 与 shell 一起使用

node.js - mongodb TypeError : client. db.collection 不是函数

java - 为什么在vertx的Handlebars库中调用Synchronize?

javascript - 如何使用 Paper.js 计算闭合多边形路径的内 Angular ?

c# - 尝试了解 "Common"与 ASP.NET 和 HttpClient() 的异步死锁

java - Spring 启动: Async request not returning anything

javascript - 在 JavaScript 中,let、require 和 prototype 如何协同工作来创建对象?