当前位置:首页 > 日记 > 正文

Nodejs回调加超时限制两种实现方法

Nodejs回调加超时限制两种实现方法

Nodejs回调加超时限制两种实现方法

Nodejs下的IO操作都是异步的,有时候异步请求返回太慢,不想无限等待回调怎么办呢?我们可以给回调函数加一个超时限制,到一定时间还没有回调就表示失败,继续后面的步骤。

方案1:用async的parallel实现

在这里我用到了async的parallel方法,parallel可以让若干个异步回调的方法并行执行,正常情况下,所有回调函数都完成后会汇集到parallel最终的回调函数里,但是有一种例外,如果其中一个步骤有错误抛出并直接调用parallel最终的回调函数,利用这个特点就可以实现我们要的功能。

我封装了一个函数asyncWrapper, 逻辑比较简单,直接看代码:

async-timer.js

const async = require('async');const asyncWrapper = (fn, interval, ...args) =>{  let final_callback = args[args.length-1];  async.parallel([    function(callback){      args[args.length - 1] = callback;      fn.apply(this, args);    },    function(callback){      setTimeout(function(){        callback(408);      }, interval);    }  ],  function(err, results){    if(err==408 && results[0])err = null;    final_callback.apply(this,[err].concat([results[0]]));  });}if(module.parent){  exports.asyncWrapper = asyncWrapper;}else{  let myfn = (arg_1, arg_2, callback) => {    setTimeout(function(){      callback(null,'value 1: '+arg_1,'value 2: '+arg_2);    }, 1000);  }  asyncWrapper(myfn, 2000, 10, 20, (err, values)=>{    console.log(`${err}, ${values}`);  });}

你可以直接运行这个js看看效果:

node async-timer.js

模块调用方法:

const asyncWrapper = require('./async-timer.js').asyncWrapperconst fn = (arg1, arg2, callback) => {   //...假设这里过程很漫长,有可能超时   callback(null, result_1, result_2);}asyncWrapper(   fn,//异步函数   10000,//超时时间   'arg1_value',//异步函数的参数1   'arg2_value',//异步函数的参数2,有多个参数就在后面继续加   (err, results)=>{    //results : [result_1, result_2]    //最后的回调,results比较特殊,fn有多个返回值时,results会以数组的形式返回给你   });

这种方案的好处是对node没有最低版本要求,引入async库就可以用,缺陷是最终返回的值都是在一个参数里面以数组的形式呈现。

方案2:用Promise实现

在promise里面加settimeout,超过时间就reject。

promise-timer.js

const promiseWrapper = (fn, interval, ...args) =>{ let final_callback = args[args.length-1]; new Promise((resolve, reject)=>{ args[args.length - 1] = (err, ...vals)=>{  if(err)reject(err);  else resolve(vals); };    fn.apply(this, args);    setTimeout(_=>{     reject('Promise time out');    }, interval); }) .then( result => {  final_callback.apply(this, [null].concat(result)); } )  .catch(err=>{   final_callback(err);  })}if(module.parent){  exports.promiseWrapper = promiseWrapper;}else{  let myfn = (arg_1, arg_2, callback) => {    setTimeout(function(){      callback(null,'value 1: '+arg_1,'value 2: '+arg_2);    }, 1000);  }  promiseWrapper(myfn, 1000, 10, 20, (err, value_1, value_2)=>{    console.log(`${err}, value 1: ${value_1} ... value 2: ${value_2}`);  });}

模块调用方法:

const asyncWrapper = require('./promise-timer.js').promiseWrapperconst fn = (arg1, arg2, callback) => {   //...假设这里过程很漫长,有可能超时   callback(null, result_1, result_2);}promiseWrapper(   fn,//异步函数   10000,//超时时间   'arg1_value',//异步函数的参数1   'arg2_value',//异步函数的参数2,有多个参数就在后面继续加   (err, result_1, result_2)=>{    //最后的回调   });

这种方案要求nodejs版本高于5.0,支持Promise。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

jquery hover 不停闪动问题的解决

jquery hover 不停闪动问题的解决

解决方法,亦为,电脑软件,jquery,hover,在前端开发中用的较多的是jquery,之前遇到一个问题,一个下拉的jquery下拉菜单效果,hover上去,一直闪动,用mouseovermouseout好好的,当时没搞定,今天逛论坛看到一个方法,可以行.只怪自己之前看jquery a…

word论文排版技巧

word论文排版技巧

论文排版,技巧,电脑软件,word,又是一年毕业季,想必最让人头疼的就是论文的事情了吧?毕业论文最基本的一点就是要格式符合要求,今天给大家总结了Word论文排版九大技巧。1、用好样式编写论文,一定要使用样式,除了Word原先所提供的标题、正文等样…

PS图象处理软件是如何使一个立体效

PS图象处理软件是如何使一个立体效

图象,处理软件,海报,效果,电脑软件,很多人用PS来设计海报。用PS制作海报方便快捷,省去了很多麻烦。今天的教程结果主要由三维文字和装饰部分组成,立体字基本上是用一个简单的3D工具完成的,然后颜色和纹理需要调整,装饰部分需要慢慢收集相关材料…

解决WIN2003服务器上传文件大小限

解决WIN2003服务器上传文件大小限

服务器,文件大小,上传,电脑软件,Windows2003系统下,上传较大的文件时,出现“Request 对象 错误 'ASP 0104 : 80004005'”错误。更改win2003的IIS 6.0对asp的上传文件大小为200k限制,aspx的上传程序没有影响。在IIS6.0中,默认设置是…

用javascript获取任意颜色的更亮或

用javascript获取任意颜色的更亮或

示例代码,颜色值,颜色,电脑软件,javascript,前言本文主要给大家介绍的是关于利用javascript获取任意颜色更亮或更暗颜色值的相关内容,下面话不多说,来一起看看详细的介绍:预处理CSS,比如Sass和less可以通过设定一个特定值,让任何颜色变得更亮或…

如何将EXCEL表格的内容导入到Corel

如何将EXCEL表格的内容导入到Corel

如何将,表格,导入到,内容,电脑软件,CorelDRAW中能做表格?答案是肯定的,而且方法不止一种,之前的教程中我们就介绍了两种方法:利用图纸工具或者表格工具。现在教大家一个更快捷、简单的方法,将Excel表格直接导入到CDR软件,立刻完成你的表格绘制,而…

ps怎么制作格子背景

ps怎么制作格子背景

格子,背景,电脑软件,ps,   今天小编分享的这篇教程是入门学习者们使用PS简单快速制作格子信纸,教程制作出来的信纸挺可爱的,推荐一下和朋友们一起分享学习了,我们先来看看最终的效果图吧:ps怎么制作格子背景效果5)(在图案上放上自…

PS制作角色扮演按钮

PS制作角色扮演按钮

角色扮演,按钮,电脑软件,PS,用ps软件制作的一个个性按钮的播放方法,教程真的很好,值得学习,一起学习吧! 方法/步骤 创建一个圆角矩形的透明矩形画布,并设置参数。 画面中的选择形式 设置选择表单的参数 建立新的圆形图形,并为其参数设置右键。…

Excel将文本转换为数字的方法是什

Excel将文本转换为数字的方法是什

方法,文本,数字,转换为,四种,  当导入在另一程序中创建的文件或导入从大型机下载的文件时,Excel 2003 可能会将其中的某些数字识别为文本。以下是小编为您带来的关于Excel将文本转换为数字的四种方法,希望对您有所帮助。Excel将文本转换为…

详细MySQL导出表中数据的示例

详细MySQL导出表中数据的示例

数据,导出表,示例,详细,电脑软件,MySQL的详细解释以导出指定表中的数据 要求uff1a 1。不要导出创建表的语句,因为表已经构建:默认将被导出,第一个下拉表,然后创建表; 2。导出INSERT语句,加上忽略,允许重复执行:默认情况下不会添加忽略; 3。INSERT…

Outlook 2010如何撤回已发送邮件

Outlook 2010如何撤回已发送邮件

发送邮件,撤回,电脑软件,Outlook,对于工作中需要频繁使用邮件传递信息的朋友们,很多时候难免会发错收件人,或者发出去的邮件可能不太完善需要修改,在收件人没有阅读时我们通过什么方式撤回已经发送的邮件呢?下面给大家介绍详细操作方法。第一…