Nodejs回调加超时限制两种实现方法
北京pk10冠军技 发布时间:06-11 来源:鹏鹏编程网 浏览:8次
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').asyncWrapper
 
 
const 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').promiseWrapper
 
 
const 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。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
如果你有好的win10资讯或者win10教程,以及win10相关的问题想要获得win10系统下载的关注与报道。
欢迎加入发送邮件到657025171#qq.com(#替换为@)。期待你的好消息!
北京pk10单双大小玩法 北京pk10高手交流qq群 北京pk10彩票公式 北京快乐8在线人工计划 北京pk10的2期5码计划 上海时时乐群
北京赛车pk10冠军公式 北京赛车pk10冠军公式 pk10冠军技巧5码公式 北京赛车pk10微信群 北京pk10每天几点开始 上海时时乐组选图
北京pk10冠军走势图 pk10冠军技巧5码公式 北京pk10冠亚军技巧 北京pk10冠军技巧 北京pk10猜冠军技巧 pk10冠军技巧5码公式
北京快乐8官网开奖结果 快乐30 天天pk10计划软件 双色球走势图 上海时时乐开奖彩票控
自助早餐加盟 早点项目加盟 口口香早点加盟 灯饰加盟 特色早点加盟店排行榜
河南早点加盟 营养粥加盟 连锁店加盟 早餐馅饼加盟 全国连锁加盟
早点 加盟 加盟早点车 早点加盟连锁 早饭加盟 上海早点加盟
全球加盟网 早餐加盟店 安徽早点加盟 早餐加盟网 特色早点加盟店
时时彩最新公式 香港六合彩聊天室 49选7开奖历史记录 江苏快三开奖结果查询 上海快三中奖规则
体彩11选5最聪明的玩法 黑龙江36选7 2002年 腾讯分分彩计划软件 旺角六合心水论坛 贵州快3官方开奖
四肖中特三期必开一期 11选5下期推算方法 山西快乐十分平台 黑龙江十一选五 四川快乐12开奖号码
免费公开精准平特一肖 11选5杀号大师100准确 快乐十分钟开奖号码 多乐彩公式 黑龙江6加1开奖结果查询