node.js async瀑布每个函数有多个回调

时间:2014-06-18 15:33:59

标签: node.js async.js

使用async.waterfall时,可以多次调用回调函数吗?如果是这样,为什么不呢?

我期望(在下面的示例中显然是错误的),应该能够在函数内多次调用回调。

示例:

var async = require("async");
var accumulator = [];
var moment = require("moment");

function results(err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
}

function inserter(data, callback) {

    if (data === null) {
        callback(null, accumulator);
    } else {
        if (accumulator.length >= 5) {
            callback(null, accumulator);
            accumulator = [];
        } else {
            accumulator.push(data);
        }
    }
}

function iFindMultitudes(callback) {
    var i;
    for (i = 0; i <= 20; i = i + 1) {
        setTimeout(function () {
            callback(null, moment().format());
        }, Math.floor((Math.random() * 10) + 1) * 1000);
    }
    callback(null, null);
}

async.waterfall([
        iFindMultitudes,
        inserter
        ], results);

这给了我:

[ '2014-06-18T11:49:17-04:00',
  '2014-06-18T11:49:17-04:00',
  '2014-06-18T11:49:18-04:00',
  '2014-06-18T11:49:19-04:00',
  '2014-06-18T11:49:20-04:00' ]
[ '2014-06-18T11:49:21-04:00',
  '2014-06-18T11:49:21-04:00',
  '2014-06-18T11:49:22-04:00',
  '2014-06-18T11:49:22-04:00',
  '2014-06-18T11:49:22-04:00' ]
[ '2014-06-18T11:49:23-04:00',
  '2014-06-18T11:49:23-04:00',
  '2014-06-18T11:49:23-04:00',
  '2014-06-18T11:49:23-04:00',
  '2014-06-18T11:49:25-04:00' ]

功能&#34; iFindMultitudes&#34;在我的例子中,是一个xml解析器函数,它返回多个json对象,这些对象被传递给api。我只限于每个插入的n个json对象,并且给定的xml文件几乎总是超过n。

这里有什么奇怪的,是瀑布显然正在死而不会抛出错误。文档没有明确说明我不能这样做。 (我知道,我知道。)

我是否试图在这里做一些明确错误的事情来保持我的最后价值不被积累?如果是这样,我很想知道原因。

更新:显然这是禁忌

https://github.com/caolan/async/issues/559
https://github.com/caolan/async/issues/557

......但我还不清楚为什么会这样。

0 个答案:

没有答案