async学习笔记

Reading time ~1 minute

异步库对于js来说,重要性不用多说,这次刚开始选的时候,按照大家的意见,选了async,于是便把async学了下,本来打算把整个都看了再发出来,所以一直留着了,不过现在想想,还是直接发了算了,并不是所有的都会去用,反正后面用到了没有的再去看,然后加上来。

下面就按照函数一个个的列了:

async.nextTick(function())

与nodejs的process.nextTick一样

然后接下来的函数都满足下面几点:

  • 并行的可以不调用callback,串行的必须调用callback来触发后续任务的启动;

  • 串行执行发生错误时,未启动任务忽略,并行执行发生错误时,未启动任务继续启动;

  • 并行度有限的并行相当于是在并行外层串行,故而也必须调用callback来触发后续任务的启动,执行发生错误时,未启动任务忽略,已启动任务继续执行;

  • 错误发生时,会立即执行callback,此时传递的results可能是不完整的,callback执行完后,其它任务仍会继续修改results;

async.each(arr, function(item, callback), callback(err));

对集合中元素依次调用callback

同步,并行执行

async.eachSeries(arr, function(item, callback), callback(err));

对集合中元素依次调用callback

同步,串行执行

async.eachLimit(arr, limit, function(item, callback), callback(err));

对集合中元素依次调用callback

同步,并行执行(并行度有限),发生错误时,未启动任务忽略,已启动任务继续执行

async.every(arr, function(item, callback), callback(result));

判断是否每个元素都满足条件

同步,并行执行

async.some(arr, function(item, callback), callback(result));

判断是否有元素满足条件

同步,并行执行

async.concat(arr, function(item, callback), callback(err, results))

对集合中元素依次调用callback,并将结果合并为一个数组

同步,并行执行

async.concatSeries(arr, function(item, callback), callback(err, results))

对集合中元素依次调用callback,并将结果合并为一个数组

同步,串行执行

async.detect(arr, function(item,callback), function(result))

用于取得集合中满足条件的第一个元素

同步,并行执行

async.detectSeries(arr, function(item,callback), function(result))

用于取得集合中满足条件的第一个元素

同步,串行执行

async.whilst(function(), function(callback), callback(err))

相当于while,第一个参数是判断条件,第二个参数是要做的异步工作

同步,串行执行

async.doWhilst(function(callback), function(), callback(err))

相当于do..while,第一个参数是要做的异步工作,第二个参数是判断条件

同步,串行执行

async.until(function(), function(callback), callback(err))

与while相反,判断条件为true时跳出循环,第一个参数是判断条件,第二个参数是要做的异步工作

同步,串行执行

async.doUntil(function(callback), function(), callback(err))

与do..while相反,判断条件为true时跳出循环,,第一个参数是要做的异步工作,第二个参数是判断条件

同步,串行执行

async.forever(function(callback), callback(err))

无限循环,直至出错

同步,串行执行

async.waterfall([function(result, ..., callback)], callback(err, result))

按顺序依次执行一组函数,每个函数产生的值,都将传给下一个

异步,串行执行

async.series([function(callback)], callback(err, results))

依次执行一组函数

异步,串行执行,支持关联数组(即对象)格式

async.parallel([function(callback)], callback(err, results))

依次执行一组函数

异步,并行执行,支持关联数组(即对象)格式

接下来的函数不再是只会调用一次最后的callback,而是分别调用callback,故而任何任务出错不影响其它任务的执行:

对集合中元素依次调用callback

异步,串行执行

queue = async.queue(function(task, callback), concurrency)

定义queue

queue.saturated = function()

监听:如果某次push操作后,任务数将达到或超过worker数量时,将调用该函数

queue.empty = function()

监听:当最后一个任务交给worker时,将调用该函数

queue.drain = function()

监听:当所有任务都执行完以后,将调用该函数

queue.push(task, callback(err))
queue.push([task], callback(err))

加入任务

分组执行,对集合中每组元素依次调用callback

异步,串行执行

cargo = async.cargo(function(tasks, callback), concurrency)

定义cargo

cargo.saturated = function()

监听:如果某次push操作后,任务数将达到或超过worker数量时,将调用该函数

cargo.empty = function()

监听:当最后一个任务交给worker时,将调用该函数

cargo.drain = function()

监听:当所有任务都执行完以后,将调用该函数

cargo.push(task, callback(err))
cargo.push([task], callback(err))

加入任务

不过最近又看了下promise后,真的是觉得我更喜欢promise的方式,promise感觉要比async灵活,复杂逻辑比async写出来要清楚,异常直接找链上下一个handler,避免写一堆把异常向上传的重复代码……

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017