回调在编码中越来越需要,尤其是当您考虑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);
但是,无时无刻不在发生着很多变种。在其他函数之间编写时,这变得很难阅读。这些函数本身可能就显得微不足道,以至于无法为其提供自己的文件。
回调是一种不同的方法。
示例: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。
问题内容: 在我使用的许多代码中,都有一些可怕的东西,例如: 或者-更糟糕的是: 有正确的方法来: 创建一个新的URL(或者它是一个URI)。 向其添加正确的转义参数。 在这些参数中添加格式正确的文件路径。 将其解析为字符串。 从本质上讲,仅构建字符串比正确地构建字符串太容易了。有没有一种方法可以像构建字符串一样容易 地正确 完成呢? 添加 为了清楚起见-经过一番思考-我想我正在寻找类似的东西:
在上面的代码中,当我调用函数hello()时,返回值是一个空[],而且它没有console.log内部函数的str。但是,在下面的代码集中,我使用了一个回调函数: 问题是为什么两个函数都做出了反应,并给出了不同的输出?注;在这两个代码中都有一个内部函数,它应该创建一个可以访问外部作用域的新作用域?有人对这个问题有很好的解释吗?谢谢
问题内容: 我处理的数值数据通常会按0.01 * Value_of_variable进行向上或向下编辑,因此与普通的文本单元格相比,微调器看起来是一个不错的选择。 我看过DefaultCellEditor,但是它将仅包含文本字段,组合框或复选框。 有使用微调器的便捷方法吗? 问题答案: …并覆盖getCellEditorValue()方法:
因此,作为家庭作业,我的任务是编写包含5种静态方法的代码。其中两人要求提供以下内容: “编写一个以整数X为参数的方法,如果X为偶数,则返回true;如果X为奇数,则返回false。” 和 “编写一个以正整数N为参数的方法,如果N是素数,则返回true,否则返回false。假设N 我不清楚我是否需要打印出正确或错误的方法。在我将println添加到方法调用之前,它们显然没有打印。所以我想我有两个问题
我正在编写一个带有事务回滚的简单json数据库。我需要向一个文件追加一行文本,然后根据追加是否成功,将成功或失败记录到另一个文件。如果需要,第二个文件用于回滚。因此,在继续之前,我需要确定写操作是否成功。 我使用stream.write追加我的文本行,其中包括一个回调,应该验证写操作的成功或失败。 然后我在下面的URL上的NodeJS文档中读到了这个不幸的消息https://nodejs.org/
问题内容: 我需要进行以下测试,以验证是否已调用Person类的所有getter。到目前为止,我已经使用了Mockito的verify()来确保每个getter都被调用。有没有办法通过反思做到这一点?可能是将新的吸气剂添加到Person类的情况,但是测试会错过这一点。 问题答案: 通常,不要嘲笑被测类。如果您的测试是针对Person的,则您永远都不会看到它,因为这很明显地表明您正在测试模拟框架而不