有没有为javascript建立方便的回调编写风格?
回调在编码中越来越成为一种需求,特别是当您考虑Node.JS的非阻塞工作方式时。但是编写大量的协同程序回调很快就变得很难读懂了 例如,想象如下: 这是我们经常看到的,很容易变得更复杂 当每个函数至少长两行时,就可以将函数分开:有没有为javascript建立方便的回调编写风格?,javascript,node.js,syntax,coding-style,callback,Javascript,Node.js,Syntax,Coding Style,Callback,回调在编码中越来越成为一种需求,特别是当您考虑Node.JS的非阻塞工作方式时。但是编写大量的协同程序回调很快就变得很难读懂了 例如,想象如下: 这是我们经常看到的,很容易变得更复杂 当每个函数至少长两行时,就可以将函数分开: // Imagine something more complex function mary(data, pictures) { // Do something drastic } // I want to do mary(), but I need to
// Imagine something more complex
function mary(data, pictures) {
// Do something drastic
}
// I want to do mary(), but I need to write how before actually starting.
function nana(callback, cbFinal) {
// Get stuff from database or something
callback(nene, cbFinal, data);
}
function nene(callback, cbFinal, data) {
// Do stuff with data
callback(nini, cbFinal, data);
}
function nini(callback, data) {
// Look up pictures of Jeff Atwood
callback(data, pictures);
}
// I start here, so this story doesn't read like a book even if it's quite straightforward.
nana(nene, mary);
但是经常会有很多路过的球员。如果在这两者之间写入其他函数,则很难读取。函数本身可能太微不足道,不足以证明给它们自己的文件是合理的。另一种回调方法是承诺 示例:jQueryAjax。这个可能看起来很熟悉
$.ajax({
url: '/foo',
success: function() {
alert('bar');
}
});
但是,$.ajax也返回了一个承诺
var request = $.ajax({
url: '/foo'
});
request.done(function() {
alert('bar');
});
好处是,您可以模拟同步行为,因为您可以使用返回的承诺,而不是提供对$.ajax.success的回调以及对回调和回调的回调。。。。另一个优点是,您可以链接/聚合承诺,并且如果愿意,可以为一个承诺聚合使用错误处理程序
我发现它非常有用。
它描述了回调、承诺和其他技术的优缺点
例如AngularJS iirc使用的一种流行实现是。一种不同的回调方法是承诺 示例:jQueryAjax。这个可能看起来很熟悉
$.ajax({
url: '/foo',
success: function() {
alert('bar');
}
});
但是,$.ajax也返回了一个承诺
var request = $.ajax({
url: '/foo'
});
request.done(function() {
alert('bar');
});
好处是,您可以模拟同步行为,因为您可以使用返回的承诺,而不是提供对$.ajax.success的回调以及对回调和回调的回调。。。。另一个优点是,您可以链接/聚合承诺,并且如果愿意,可以为一个承诺聚合使用错误处理程序
我发现它非常有用。
它描述了回调、承诺和其他技术的优缺点
例如AngularJS iirc使用的一种流行实现是。使用异步流控制库,如。它提供了一种干净的方法来构造需要多个异步调用的代码,同时维护它们之间存在的任何依赖关系(如果有的话) 在您的示例中,您将执行以下操作:
async.series([
function(callback) { col.count(queryFilter, callback); },
function(callback) { col.count(queryCached, callback); },
function(callback) { col.remove(query, callback); },
function(callback) { col.count(queryAll, callback); }
], function (err, results) {
if (!err) {
util.log(util.format('MongoDB cleanup: %d filtered and %d cached records removed. %d last-minute records left.',
results[0], results[1], results[3]));
}
});
这将执行串联的每个功能;第一个调用其回调后,第二个调用,依此类推。但是您也可以使用并行流、瀑布流或任何与您正在寻找的流相匹配的流。我发现它比使用promises更干净。使用异步流控制库,如。它提供了一种干净的方法来构造需要多个异步调用的代码,同时维护它们之间存在的任何依赖关系(如果有的话) 在您的示例中,您将执行以下操作:
async.series([
function(callback) { col.count(queryFilter, callback); },
function(callback) { col.count(queryCached, callback); },
function(callback) { col.remove(query, callback); },
function(callback) { col.count(queryAll, callback); }
], function (err, results) {
if (!err) {
util.log(util.format('MongoDB cleanup: %d filtered and %d cached records removed. %d last-minute records left.',
results[0], results[1], results[3]));
}
});
这将执行串联的每个功能;第一个调用其回调后,第二个调用,依此类推。但是您也可以使用并行流、瀑布流或任何与您正在寻找的流相匹配的流。我发现这比使用承诺要干净得多。将答案和文章结合起来。为了每个人的利益,请编辑此答案并以简单明了的方式添加库/示例/文档URL 关于承诺的文件 异步库
综合答案和文章。为了每个人的利益,请编辑此答案并以简单明了的方式添加库/示例/文档URL 关于承诺的文件 异步库
谢谢,这很有价值。那些承诺看起来很有希望。我正在寻找一种“秒”方式,将其直接应用于Node.JS或普通javascript。我现在会投票支持你的答案,但在我接受答案之前,请等待更多答案听起来很有希望,但Github上的文档令人困惑。他们的意思是好的,但他们没有解释一些基本的东西,比如什么东西需要去哪里才能真正使用它。是一个很好的概述,你可能认识到这些构造,但是,对于那些对这项技术来说是新手的人来说,没有简单的事实列表,比如去哪里、返回什么地方、错误如何被抛出、是否被指定回调等等。我认为我自己是一个技术娴熟的人,但是你知道更多无知的人的资源吗?你能在你的答案中提供一个例子吗?如何在Q中完成上面的末日金字塔?谢谢你,这是很有价值的。那些承诺看起来很有希望。我正在寻找一种“秒”方式,将其直接应用于Node.JS或普通javascript。我现在会投票支持你的答案,但在我接受答案之前,请等待更多答案听起来很有希望,但Github上的文档令人困惑。他们的意思是好的,但他们没有解释一些基本的东西,比如什么东西需要去哪里才能真正使用它。这是一个很好的概述,您可能会认识到这些结构,但是对于这个技术的新手来说,没有简单的fa列表
CTS喜欢去哪里,返回什么地方,怎么扔错误,都是指定回调等等。我认为自己是个技术精明的人,但是你知道更多无知的人需要什么资源吗?你能在你的答案中提供一个例子吗?如果我用更通用的async.瀑布方法函数r,queryFilter,cb{col.countqueryCached,cb;tools.log'teststep 2';}来做同样的事情,它不会超过步骤2。您是否有可能将瀑布变量添加到您的答案中?@Redsandro在函数中省略err参数。但是,瀑布似乎不适合您的示例,因为您需要util.log调用之前的所有结果,而不仅仅是链中最后一个函数的结果。我明白了,谢谢。我认为瀑布函数更通用,因为您可以根据需要向回调函数传递任意多个函数,尽管在本例中,只要您指定它们,就可以传递一个函数:functionthis,vars,will,be,available,callback\\in util.logIf我对更通用的async.瀑布方法functionerr,queryFilter,cb也这样做{col.countqueryCached,cb;tools.log'teststep 2';}它没有超过第2步。您是否有可能将瀑布变量添加到您的答案中?@Redsandro省略了函数中的err参数。但是,瀑布似乎不适合您的示例,因为您需要util.log调用的所有以前的结果,而不仅仅是链中最后一个函数的结果。我明白了,谢谢。我知道了nk瀑布更通用,因为您可以根据需要向回调传递任意多个函数,尽管在本例中,只要您指定它们,就可以传递一个函数:functionthis、vars、will、be、available、callback\\in util.log
Q.fcall(func1)
.then(func2)
.then(func3)
.then(funcSucces, funcError)