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

使用Node.js同步代码与异步代码

郑和泰
2023-03-14
问题内容

我们正在与节点合作,主要用于内部项目,并了解使用该技术的最佳方法。

并非来自特定的异步背景,学习曲线可能是一个挑战,但是我们已经习惯了框架和学习过程。

使我们两极分化的是,何时才是使用同步代码与异步代码的最佳时间。我们目前使用的规则是,如果任何东西与IO进行交互,那么它必须通过回调或事件发射器(即给定的)是异步的,但是可以将任何未使用IO的其他项构造为同步函数(此方法还将取决于函数本身的繁重程度以及其实际阻塞程度),但这是使用Node.js时采取的最佳方法吗?

例如,我们正在创建一个Hal +
JSON构建器,该构建器当前存在于我们的代码库中。之所以是同步的,仅仅是因为它所做的只是创建一些很小的对象文字,仅此而已,没有外部依赖关系,当然也没有IO交互。

我们的方法是否适合采用?


问题答案:

假设您有两个函数foobar,它们正在同步执行:

function foo() {
    var returnValue = bar();
    console.log(returnValue);
}

function bar() {
    return "bar";
}

为了使API“异步”是将其更改为使用回调:

function foo() {
    bar(function(returnValue) {
        console.log(returnValue);
    });
}

function bar(callback) {
    callback("bar");
}

但事实上,该代码仍然是完全同步的。回调是在同一个调用堆栈上执行的,没有进行线程优化,也没有扩展性。

这就成为了代码可读性和编码风格的问题。我个人认为典型的var val = func();类型代码更易读和易于理解。唯一的缺点是,如果您某一天需要更改其功能bar,则需要执行一些I /
O活动或调用其他异步的功能,则还需要更改API bar

个人的 喜好:在适用时使用传统的同步模式。涉及I / O或有疑问时,请始终使用异步样式。



 类似资料:
  • 异步代码是指当调用后不会立即完成的代码。 setTimeout(() => { console.log('do stuff'); }, 3000 ) 在 setTimeout 执行完3秒后 do stuff 会输出到控制台。我们可以看出当指定的时间过去后我们所提供的异步函数会触发。现在来看个更有启发性的示例: doWork( () => { console.log('call me whe

  • 使用Mocha测试异步代码并不简单!只需在测试完成后调用回调。通过添加一个回调(通常命名done)it(),Mocha将知道它应该等待调用此函数来完成测试。此回调接受Error实例(或其子类)或伪值; 其他任何事情都会导致测试失败。 describe('User', function() { describe('#save()', function() { it('should save wi

  • 在测试同步代码时,省略回调,Mocha将自动继续进行下一次测试。 describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { [1,2,3].indexOf(5).should.eq

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 是否可以调用一个异步方法,以便它从一个同步的方法异步运行?我不关心它挂起同步调用程序直到它返回,而是希望该方法被异步调用。

  • 假设我有以下内容: 然后我这样称呼它: 我省略了并且没有将声明为这一事实是否使它实际上是异步的? 我希望发生的情况是循环会立即完成,因为即使花费了很长时间,也不会被等待,并且会立即返回。 我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道何时完成)。 那么,简单地说,从非异步方法调用函数是否会自动使代码同步执行,以及省略和(如在函数