30-seconds-code——adapter

緣自世界發表於2017-12-29

英文文章來源於:https://github.com/Chalarangelo/30-seconds-of-code/blob/master/README.md

Adapter

call

給定一個鍵值和一組引數,但給定一個上下文時呼叫它們。

使用閉包呼叫儲存的鍵值與儲存的引數

const call = ( key, ...args ) => context => context[ key ]( ...args );
/*
Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
const map = call.bind(null, 'map')
Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
*/

collectInto

改變一個可以接受陣列為引數的函式成為可變數函式.

給定一個函式,它返回一個把所有傳入的引數轉變為陣列的閉包函式.

const collectInto = fn => ( ...args ) => fn( args );
/*
const Pall = collectInto( Promise.all.bind(Promise) )
let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = new Promise((resolve) => setTimeout(resolve,2000,3))
Pall(p1, p2, p3).then(console.log)
*/

flip

Flip 利用一個函式作為引數,然後降低一個引數轉變為最後一個引數

用一個閉包接受可變引數的輸入, 在使用出第一個引數外的其餘引數前先拼接第一個引數使它成為最後一個引數.

const flip = fn => (...args) => fn(args.pop(), ...args)
/*
let a = {name: 'John Smith'}
let b = {}
const mergeFrom = flip(Object.assign)
let mergePerson = mergeFrom.bind(a)
mergePerson(b) // == b
b = {}
Object.assign(b, a) // == b
*/

pipeFunctions

從左到右的執行函式組合.

Array.reduce() 和 spread (...) 操作符來實現從左向右的執行函式組合. 第一個函式可以接受任意個引數,其餘的只能接受一個引數.

const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
/*
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = pipeFunctions(multiply, add5)
multiplyAndAdd5(5, 2) -> 15
*/

promisify

轉化一個返回 promise 的非同步函式.

返回一個函式,它返回一個呼叫所有原始函式的 Promise .
...rest 去傳遞輸入的引數.

在 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

spreadOver

用一個可變引數的函式並返回一個閉包,該閉包可以將輸入的陣列引數的轉變為引數序列.

用閉包和spread (...) 操作符去對映一個函式的引數陣列.

const spreadOver = fn => argsArr => fn(...argsArr);
/*
const arrayMax = spreadOver(Math.max)
arrayMax([1,2,3]) // -> 3
arrayMax([1,2,4]) // -> 4
*/

更多關於30-seconds-code中文翻譯https://github.com/lvzhenbang/article/blob/master/js/30-seconds-code/index.md

相關文章