微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

解决方法

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

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

function async(callback) {
  setTimeout(function() {
    callback();
  },100);
}

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

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

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

makeRequest(function(result) { doSomethingWithResult(result); });
doSomethingElse();

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

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

调用始终是异步的,doSomethingElse始终在doSomethingWithResult之前运行.

原文地址:https://www.jb51.cc/js/158869.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐