Chain asynchronous functions (链式异步函数)
循环遍历包含异步事件的函数数组,当每个异步事件完成时调用 next
。
const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); };
/*
chainAsync([
next => { console.log('0 seconds'); setTimeout(next, 1000); },
next => { console.log('1 second'); setTimeout(next, 1000); },
next => { console.log('2 seconds'); }
])
*/
Curry (函数柯里化)
使用递归。
如果提供的参数(args
)的数量足够,则调用传递的函数 fn
,否则返回一个柯里化函数fn
,等待传入剩下的参数。
如果你想要一个接受参数数量可变的函数(一个可变参数函数,例如Math.min()
),你可以选择将参数个数传递给第二个参数arity
。
const curry = (fn, arity = fn.length, ...args) =>
arity <= args.length
? fn(...args)
: curry.bind(null, fn, arity, ...args);
// curry(Math.pow)(2)(10) -> 1024
// curry(Math.min, 3)(10)(50)(2) -> 2
Pipe (管道)
使用 Array.reduce()
让值在函数间流通。
const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);
// pipe(btoa, x => x.toUpperCase())("Test") -> "VGVZDA=="
Promisify (promise转化)
使用 currying
返回一个函数,返回一个调用原始函数的 Promise
。 使用 ...rest
运算符传入所有参数。
In Node 8+, you can useutil.promisify
Node 8 版本以上,你可以使用 util.promisify
const promisify = func =>
(...args) =>
new Promise((resolve, reject) =>
func(...args, (err, result) =>
err ? reject(err) : resolve(result))
);
// const delay = promisify((d, cb) => setTimeout(cb, d))
// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s
Run promises in series (队列运行promise)
使用 Array.reduce()
通过创建一个promise
链来运行一系列 promise
,每个 promise
在解析时返回下一个 promise
。
const series = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
// const delay = (d) => new Promise(r => setTimeout(r, d))
// series([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete
Sleep (睡眠)
通过返回一个 Promise
延迟执行 async
函数,把它放到睡眠状态。.
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
/*
async function sleepyWork() {
console.log('I\'m going to sleep for 1 second.');
await sleep(1000);
console.log('I woke up after 1 second.');
}
*/