一尘不染

是否已建立方便的JavaScript回调编写样式?

node.js

回调在编码中越来越需要,尤其是当您考虑Node.JS非阻塞工作方式时。但是快速编写大量 协程回调 变得很难读回。

例如,想象一下像这样的《毁灭金字塔》

// This asynchronous coding style is really annoying. Anyone invented a better way yet?
// Count, remove, re-count (verify) and log.
col.count(quertFilter,          function(err, countFiltered) {
    col.count(queryCached,      function(err, countCached) {
        col.remove(query,       function(err) {
            col.count(queryAll, function(err, countTotal) {
                util.log(util.format('MongoDB cleanup: %d filtered and %d cached records removed. %d last-minute records left.', countFiltered, countCached, countTotal));
            });
        });
    });
});

是我们经常看到的东西,并且很容易变得更加复杂。

当每个功能至少长几行时,分离功能就变得可行了:

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

但是,无时无刻不在发生着很多变种。在其他函数之间编写时,这变得很难阅读。这些函数本身可能就显得微不足道,以至于无法为其提供自己的文件。


阅读 187

收藏
2020-07-07

共1个答案

一尘不染

回调是一种不同的方法。

示例:jQuery Ajax。这可能看起来很熟悉。

$.ajax({
  url: '/foo',
  success: function() {
      alert('bar');
  }  
});

但是$ .ajax也会返回一个承诺。

var request = $.ajax({
  url: '/foo'
});

request.done(function() {
    alert('bar');
});

好处是,您可以模拟同步行为,因为您可以使用返回的Promise而不是提供$
.ajax.success的回调以及回调和回调的回调…。另一个优点是,可以链接/汇总诺言,并根据需要为一个诺言-汇总提供错误处理程序。

我发现这篇文章非常有用。它描述了回调,promise和其他技术的优缺点。

一种流行的实现(例如通过AngularJS IIRC使用)是Q

2020-07-07