当前位置: 首页 > 面试题库 >

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

公良浩邈
2023-03-14
问题内容

回调在编码中越来越需要,尤其是当您考虑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的,则您永远都不会看到它,因为这很明显地表明您正在测试模拟框架而不