修改
回答所有答案,
最后我决定使用像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,性能如何?
答案 0 :(得分:4)
是基于节点的代码的一个大问题;你经常成长“回调金字塔”。有几种方法可以解决这个问题:
代码风格:
将此烦恼作为一个机会,将您的代码分解为一口大小的块。这意味着你可能会有一个很小的命名函数 - 但这可能就好了!您可能还会发现更多重用机会。
流量控制库
那里有5937.2亿个流量控制库。这是一些比较流行的:
语言扩展程序
有几种尝试在JavaScript(或CoffeeScript)之上提供更具同步感的语法,通常基于tame paper背后的概念。
这条路线对某些人来说是一个交易破坏者:
未来:
节点核心团队非常了解这个问题,并且还在开发更低级别的组件以帮助减轻痛苦。看起来他们将在v0.8中引入a basic version of domains,这提供了一种卷积错误处理的方法(主要避免使用常见的return err if err
模式)。
这应该开始为更清洁的流控制库奠定一个良好的基础,并开始为更一致的方式处理回调金字塔铺平道路。现在有太多的选择,社区还没有就即使是少数几个标准达成一致意见。
<强>参考文献:强>
答案 1 :(得分:1)
有大量的“延期图书馆”。看看那里http://eirikb.github.com/nipster/#promise和那里http://eirikb.github.com/nipster/#deferred。选择一个,这只是风格和问题的问题。简单:)
答案 2 :(得分: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);
同样的事情,没有嵌套。
答案 3 :(得分:0)
在某些情况下,有些库可能会有用,但总的来说,在将它们用于所有内容之后,您将不会感到兴奋。
根据缓慢的问题。由于node.js是异步的,因此包装函数不是如此大的性能消费者。
你可以在这里查看类似延迟的库
https://github.com/kriszyp/node-promise
此问题也非常相似
What nodejs library is most like jQuery's deferreds?
作为最后的奖励,我建议你看看CoffeeScript。它是一种语言,编译为javascript并具有更漂亮的语法,因为删除了函数括号
答案 4 :(得分:0)
我通常喜欢使用async.js库,因为它提供了一些关于如何执行代码的不同选项