Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有为javascript建立方便的回调编写风格?_Javascript_Node.js_Syntax_Coding Style_Callback - Fatal编程技术网

有没有为javascript建立方便的回调编写风格?

有没有为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

回调在编码中越来越成为一种需求,特别是当您考虑Node.JS的非阻塞工作方式时。但是编写大量的协同程序回调很快就变得很难读懂了

例如,想象如下:

这是我们经常看到的,很容易变得更复杂

当每个函数至少长两行时,就可以将函数分开:

// 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)