javascript - Node.js 异步函数*定义*

标签 javascript node.js asynchronous

拜托,只是为了清理一下我脑子里的东西......

我习惯于使用库中的异步函数进行编写,但我该如何编写自己的异步函数?

为了说明我的问题,我编写了一个名为“MadMathz”的模块

我知道以下是异步函数的示例用法:

//load module
var mM = require('./MadMathz');

//perform a function
mM.async_function_addthree(12, function(result) {
  console.log(result)
});

//do something straight afterwards
console.log('Logging this straight after instead of waiting for computation');

我知道该函数的第二个参数是回调,但如何定义诸如“async_function_addthree”之类的函数?就此示例而言,假设 async_function_addthree 只是将 3 添加到第一个参数。

我只是把自己弄糊涂了,试图写出我认为可能是的东西。我完全走错路了吗?我觉得我已经接近 node.js 的目标了,但这需要清理。

如果可能,请解释而不是将我链接到某个地方。我相信其他人会从这个问题中受益。

最佳答案

实际上,在没有任何进一步描述或要求的情况下创建“异步”函数听起来有点奇怪。通常,用法是为了避免长时间的阻塞。因此,如果我们有一个触发数据库查询的函数,并且我们想在完成时调用另一个函数,则应该在作业完成后调用该函数,并且原始函数立即返回控制权-流回 Node (ECMAscript)。

所以如果我们有这样的结构

function someJob( callback ) {
    // heavy work
    callback();
}

现在,这段代码仍然同步地运行。要将其置于异步 状态,我们可以调用 Node 的process.nextTick 方法

function someJob( callback ) {
    // heavy work
    process.nextTick( callback );
}

现在发生的事情是,Node 将在稍后通过其事件循环运行时执行该回调 方法(并且它也有点智能)。 Eventho nextTick 声称比 setTimeout 更有效,它几乎是一样的处理(从 ECMAscript 编码器的 Angular 来看)。所以在浏览器中我们可以像

function someJob( callback ) {
    // heavy work
    setTimeout( callback, 0 );
}

如果说上面的示例方法根本没有多大意义,那您是对的,因为异步 状态发生在繁重的工作之后。好吧,真的。事实上,您需要将繁重的部分分解成更小的和平部分,并使用 .nextTick() 来利用相同的想法,以使其真正高效。

这也是我一开始的困惑的原因,其实每个任务都已经为你提供了回调的可能性。

关于javascript - Node.js 异步函数*定义*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12835900/

相关文章:

javascript - 我怎样才能让ahoy的javascript异步函数跟踪同步

javascript - Mongoose 、 Node 和异步编码指南

javascript - 如何将具有许多状态变量的嵌套循环放入表中?

javascript - AngularJS 项目中需要使用 LocalStorage 将动态数据存储为 JSON stringify

javascript - 归内还是外为?

javascript - locomotive.js 监听http和https

multithreading - 为什么我在使用 Async.Parallel 时只有一个线程 id?

javascript - 将 javascript 变量传递到嵌入式调查表单中

每次执行函数时,Javascript ES5 : How to extend the Function object in order to set a property value on itself,?

javascript - 使用Node的 'crypto'模块时是否需要使用 key 派生?