如何在node.js中创建自定义异步函数?

Pin*_*hio 10 javascript asynchronous node.js

我不确定node.js是如何能够实现异步的哪些功能,哪些不是以及如何创建自定义异步功能.

说我想创建一个自定义异步函数.如果仅仅因为我调用异步函数回调或cb的最后一个参数它会知道它的异步函数,我会感到惊讶:

function f(arg1, callback){
  //do stuff with arg1
  arg1.doStuff()
  //call callback
  callback(null, arg1.result());
}
Run Code Online (Sandbox Code Playgroud)

我尝试了类似的东西,它没有异步工作.你怎么告诉node.js f实际上是异步的?

Ren*_*non 11

要创建异步函数,您必须在其上有一些异步原语(通常与IO相关) - 定时器,从文件系统读取,发出请求等.

例如,此函数接受一个回调参数,并在以下100ms后调用它:

function asyncFn(callback) {
  setTimeout(() => {
    callback();
  }, 100);
}
Run Code Online (Sandbox Code Playgroud)

在不需要的情况下使函数异步的可能原因是API一致性.例如,假设您有一个发出网络请求的函数,并将结果缓存以供以后调用:

var cache = null;
function makeRequest(callback) {
  if (!cache) {
    makeAjax(result => {
      cache = result;
      callback(result);
    });
  } else {
    callback(cache);
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,这个函数是不一致的:有时它是异步的,有时它不是.假设您有这样的消费者:

makeRequest(result => doSomethingWithResult(result));
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

async function函数可以在函数之前或之后doSomethingElse运行,具体取决于结果是否被缓存.现在,如果在doSomethingWithResult函数上使用异步原语,例如makeRequest:

var cache = null;
function makeRequest(callback) {
  if(!cache) {
    makeAjax(result => {
      cache = result;
      callback(result);
    });
  } else {
    process.nextTick(() => callback(cache));
  }
}
Run Code Online (Sandbox Code Playgroud)

该呼叫始终是异步的,并且process.nextTick始终在之前运行doSomethingElse.


Ber*_*rgi 7

只有本机函数(可以访问事件循环)是异步的。您需要调用其中之一来获取回调的异步性。请参阅什么是异步 javascript 函数的简单示例?.

如果您不使用任何函数,则几乎没有理由使您的函数异步。