3

编辑

感谢所有答案,
最后我决定使用Step之类的工具,

我所需要的只是“流量控制”,并且不想要任何可能会降低性能的东西(我不知道它会影响多少,或者效果可以忽略不计)。

所以我只是创建了一个用于流量控制的小工具:

line.js

/**
 * Create the "next" function
 * 
 * @param {Array} tasks 
 * @param {Number} index
 * @param {Number} last
 */
var next = function(tasks, index, last) {

    if (index == last) {

        return tasks[index + 1];
    }
    else {

        return function(data) {

            var nextIndex = index + 1;
            tasks[nextIndex](next(tasks, nextIndex, last), data);
        };
    }
};

/**
 * Invoke functions in line.
 */
module.exports = function() {

    var tasks = arguments,
        last = tasks.length - 2;

    tasks[0](next(tasks, 0, last));
};

用法:

var line = require("line.js");
line(function(next) {

    someObj.find(function(err, docs) {

        // codes
        next(docs);
    });
}, function(next, docs) {

    // codes
});

希望这可以帮助。

编辑结束


众所周知,
Node 的内置或第三方模块通常会提供异步 API,
并使用“回调”函数来处理结果。

这很酷,但有时会像这样编写代码:

                   //some codes
              }
         }
    }
}

像这样的代码很难阅读。

我知道“延迟”库可以解决这样的问题,
Node 有什么好的“延迟”模块吗?
如果我使用“延迟”对 Node 进行编码,性能如何?

4

5 回答 5

4

基于 Node的代码是一个大问题;你经常增长“回调金字塔”。有几种方法可以解决这个问题:

代码风格:

使用这种烦恼作为一个机会,将您的代码分解成一口大小的块。这意味着您可能会拥有大量的小型命名函数 - 不过这可能很好!您可能还会发现更多重用机会。

流量控制库

那里正好有 5937.2 亿个流控制库。以下是一些比较流行的:

  • Step超级基本的串行和并行流管理。
  • seq是一个更重但功能更全的流控制库。
  • 还有很多。在 npm 注册表中搜索“流”和“流控制”(抱歉,似乎不可链接)

语言扩展

有几种尝试在 JavaScript(或 CoffeeScript)之上提供更同步的语法,通常基于tame paper背后的概念。

这条路线对某些人来说是一个交易破坏者:

  • 它不是标准的 JavaScript;如果您正在构建库/框架/等,寻找帮助将更加困难。
  • 变量作用域可能会以意想不到的方式表现,具体取决于库。
  • 生成的代码可能难以调试和匹配原始源代码。

未来:

节点核心团队非常清楚这个问题,并且也在研究低级组件以帮助缓解痛苦。看起来他们将在 v0.8中引入域的基本版本return err if err,它提供了一种汇总错误处理的方法(主要是避免通用模式)。

这应该开始为更清洁的流控制库奠定良好的基础,并开始为更一致的方式处理回调金字塔铺平道路。现在有太多的选择,而且社区还没有接近就一些标准达成一致。

参考:

于 2012-04-24T01:20:00.893 回答
1

有大量的“延迟库”。看看那里http://eirikb.github.com/nipster/#promise和那里http://eirikb.github.com/nipster/#deferred。选择一个,这只是风格和简单的问题:)

于 2012-04-23T10:43:54.523 回答
1

如果你真的不喜欢这样,总是可以选择使用命名函数,这将减少缩进。

代替

setTimeout(function() {
  fs.readFile('file', function (err, data) {
    if (err) throw err;
    console.log(data);
  })
}, 200);

你可以这样做:

function dataHandler(err, data)
{
  if (err) throw err;
  console.log(data);
}

function getFile()
{
  fs.readFile('file', dataHandler);
}

setTimeout(getFile, 200);

同样的事情,没有嵌套。

于 2012-04-23T11:15:41.267 回答
0

有一些库在某些场景中可能很有用,但总的来说,在将它们用于所有事情之后你不会感到兴奋。

根据慢的问题。由于 node.js 是异步的,因此包装的函数并不是一个很大的性能消耗者。

你可以在这里寻找类似延迟的库

https://github.com/kriszyp/node-promise

这个问题也很相似

哪个 nodejs 库最像 jQuery 的 deferreds?

作为最后的奖励,我建议你看看CoffeeScript。它是一种语言,可以编译为 javascript 并且具有更优美的语法,因为函数大括号被删除了

于 2012-04-23T10:37:44.037 回答
0

我通常喜欢使用 async.js 库,因为它提供了一些关于如何执行代码的不同选项

于 2012-04-24T00:42:19.413 回答