【问题标题】:node.js async libsnode.js 异步库
【发布时间】:2011-07-05 14:14:11
【问题描述】:

有大量的库可以帮助修复回调综合症的层次。

其实太多了,我用哪一个?

【问题讨论】:

  • 我很惊讶以前从未见过任何人(包括我自己)问过这个问题,这是一个很棒的问题!

标签: node.js asynchronous callback


【解决方案1】:

我在使用其他同步库时遇到的问题是,它们经常要求我在开始时定义所有任务,并且没有提供我发现的干净直观的 API。我只是想随时随地将任务推送到一个组,然后以并行或串行方式执行该组。

我喜欢 TaskGroup 中的流程功能,并将其用于许多大型项目,包括 DocPad 和 BugHerdExamples are in the README.

【讨论】:

  • 这与 Async 的队列有何不同 - github.com/caolan/async#queue
  • PS,我认为让您更清楚这是您自己的图书馆会有所帮助。
  • 您还可以查看 Step 的群组功能。
  • 这确实与async.queue 非常相似。但是它确实有一些有用的区别:您可以为同一个队列提供各种不同的函数,而不是仅仅为单个工作函数传递数据;当它们全部完成时,你会得到一个适当的回调,而使用async.queue,你只会得到不会给你所有结果的排水事件。如果你只需要后者,那么你可以使用async.map
【解决方案2】:

我喜欢用promises from Q:

如果一个函数不能在没有阻塞的情况下返回值或抛出异常,它可以返回一个 Promise。 Promise 是一个对象,它表示函数最终可能提供的返回值或抛出的异常。 Promise 也可以用作远程对象的代理来克服延迟。

在第一次通过时,promise 可以缓解“末日金字塔”:代码向右行进比向前行进更快的情况。

step1(function (value1) {
    step2(value1, function(value2) {
        step3(value2, function(value3) {
            step4(value3, function(value4) {
                // Do something with value4
            });
        });
    });
});

使用 Promise 库,您可以展平金字塔。

Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
    // Do something with value4
}, function (error) {
    // Handle any error from step1 through step4
})
.done();

使用这种方法,您还可以获得隐式错误传播,就像 try、catch 和 finally。第 1 步中的错误会一直流到第 5 步,并在那里被捕获和处理。

回调方法称为“控制反转”。一个接受回调而不是返回值的函数是在说,“不要打电话给我,我会打电话给你。”。承诺不反转反转,将输入参数与控制流参数清晰地分开。这简化了 API 的使用和创建,尤其是可变参数、rest 和 spread 参数。

【讨论】:

【解决方案3】:

我使用Async.js

Async 是一个实用模块 提供直截了当、功能强大的 用于工作的功能 异步 JavaScript。虽然 最初设计用于 node.js,也可以直接使用 在浏览器中。

示例

async.map(['file1','file2','file3'], fs.stat, function(err, results){
    // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], path.exists, function(results){
    // results now equals an array of the existing files
});

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

【讨论】:

    【解决方案4】:

    选择一个你喜欢的:P。例如,我喜欢async。但是Step 也很有名。我认为有这么多模块是一件非常好的事情。 node.js 社区正在推出一些非常好的模块。使用 NPM 安装它们完全不会花费您任何精力。

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 1970-01-01
      • 2013-05-11
      • 2014-04-24
      • 2015-06-20
      • 1970-01-01
      • 2015-02-23
      • 2021-09-03
      相关资源
      最近更新 更多