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

匹诺曹

我不确定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相关)-计时器,从文件系统读取,发出请求等。

例如,此函数采用一个回调参数,并在100ms之后调用它:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Ember.js中创建自定义事件,或组织异步行为?

来自分类Dev

如何在AMPL中创建自定义函数?

来自分类Dev

如何在simulink中创建自定义s函数?

来自分类Dev

我如何在adonis /node.js中创建自定义验证器?

来自分类Dev

如何在Node.JS中向响应对象添加自定义函数

来自分类Dev

如何在PlayWright中运行自定义js函数

来自分类Dev

如何在cocos2d-x中创建自定义创建函数

来自分类Dev

在video-js中如何创建自定义事件?

来自分类Dev

如何在Redshift中创建自定义的聚合UDF函数?

来自分类Dev

如何在Varnish的default.vcl中创建自定义函数?

来自分类Dev

如何在自定义Wordpress插件中创建JavaScript函数

来自分类Dev

如何在node.js中创建异步方法链?

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在Node.js中处理异步函数

来自分类Dev

如何在node.js中自定义500页

来自分类Dev

如何在Babylon.js中创建自定义网格?

来自分类Dev

如何在Video.js中创建自定义HTML5菜单?

来自分类Dev

如何在ActiveAdmin gem中创建自定义页面

来自分类Dev

如何在dart中创建自定义元素?

来自分类Dev

如何在Django中创建自定义选择字段?

来自分类Dev

如何在Android中创建自定义导航抽屉

来自分类Dev

如何在Laravel 4中创建自定义外观

来自分类Dev

如何在Drupal 7中创建自定义块?

来自分类Dev

如何在AngularJs服务中创建自定义事件

来自分类Dev

如何在Moodle中创建自定义表单?

来自分类Dev

如何在C ++中创建自定义整数序列

来自分类Dev

如何在android中创建自定义渐变?

来自分类Dev

如何在SpriteKit中创建自定义混合模式

来自分类Dev

如何在Nginx中创建自定义位置?

Related 相关文章

热门标签

归档