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冠军彩票控 北京快乐8预测pc蛋蛋28 北京pk10代理加盟 北京快乐8总数单双 北京pk10 2期计划 北京快乐8任选一技巧
pk10冠军技巧5码公式 pk10冠军技巧5码公式 ty8天游娱乐网站 快赢481开奖视频
北京pk10冠军技巧 北京pk10冠军走势图 北京赛车pk10冠军公式 pk10冠军技巧 北京pk10冠军走势图 北京赛车pk10冠军公式
北京pk10计划群发 北京赛车pk10五码公式 北京快乐8号码预测 北京pk10技巧规律2码 pk10定位胆玩法
早餐粥店加盟 传统早餐店加盟 清美早餐加盟 大福来早点加盟 早点加盟店10大品牌
早餐加盟项目 传统早餐店加盟 早餐粥车 早餐配送加盟 早餐馅饼加盟
健康早餐加盟 早餐类加盟 包子早点加盟 移动早点加盟 四川特色早点加盟
早餐粥加盟 范征早餐加盟 特许加盟 移动早餐加盟 早点工程加盟
广西快3开奖结果历史查询 广东11选5任二推荐号码推荐 浙江快乐12选5遗漏任八 山东11选5今天推荐号 白小姐玄机图
广西11选5前3直 太阳城娱乐城 广东11选5和重庆时时彩哪个好玩 天津11选5技巧 重庆快乐十分计划
手机广东11选5预测软件 日本七星代购 福建快3跨度走势图 内蒙古快三走势图 22选5河南最新开奖
北京11选5前三直走势图 甘肃11选5遗漏 湖南体彩网幸运赛车 北京赛车pk10开奖直播软件下载 广东11选5玩法介绍-上皇巢网