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

标签 javascript node.js asynchronous

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

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

function f(arg1, callback){
  //do stuff with arg1
  arg1.doStuff()
  //call callback
  callback(null, arg1.result());
}

我尝试了类似的方法,但它不能异步工作。如何告诉 node.js f 实际上是异步的?

最佳答案

注意:这个答案写于 2014 年,在 async function 存在之前,并且在 Promises 流行之前。虽然同样的原则也适用,但我建议您先阅读 Promises,然后再尝试了解它们与“传统”回调驱动的异步函数之间的关系。


要创建一个异步调用其回调的函数,您必须在其上使用一些平台提供的异步原语(通常与 IO 相关) - 计时器、从文件系统读取、发出请求等。

例如,这个函数接受一个回调参数,并在 100 毫秒后调用它:

function asyncFn(callback) {
  setTimeout(() => {
    callback();
  }, 100);
}

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

var cache = null;
function makeRequest(callback) {
  if (!cache) {
    makeAjax(result => {
      cache = result;
      callback(result);
    });
  } else {
    callback(cache);
  }
}

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

makeRequest(result => doSomethingWithResult(result));
doSomethingElse();

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

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

调用总是异步的,doSomethingElse总是在doSomethingWithResult之前运行。

关于javascript - 如何在 node.js 中创建自定义异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22286887/

相关文章:

javascript - 在按下另一个输入字段的按键时触发输入字段的按键事件?

javascript - 如果选择下拉菜单,则显示额外的表单字段

javascript - 使用 fetch api 在 react 中发帖

javascript - Gulp多个src

asynchronous - 在Dart中以同步方式运行异步代码

javascript - 将订阅者捆绑到进行中的异步请求 - RxJS

javascript - 在数组中搜索字符串的最佳方法

javascript - 快速中间件的正确使用方法?

java - 等待从尚未创建的服务器下载文件的最佳方法?

javascript - 自动验证 Div 输入