摘要:給定一個函數,返回一個閉包,該閉包將所有輸入收集到一個數組接受函數中。返回一個可變參數的閉包,在應用其他參數前,先把第一個以外的其他參數作為第一個參數。
本系列翻譯自開源項目 30-seconds-of-codeary這是一個非常優秀的系列,文章總結了大量的使用es6語法實現的代碼模塊不是說真的三十秒就能理解,也需要你認真的思考,其中有一些點非常精妙,很值得一讀。
本文在我的github同步更新,你可以看到當前翻譯的全部系列。
如果您對本期有不同或者更好的見解,請在下方評論告,喜歡請點個贊,謝謝閱讀。
創建一個可以接收n個參數的函數, 忽略其他額外的參數。
調用提供的函數fn,參數最多為n個, 使用 Array.prototype.slice(0,n) 和展開操作符 (...)。
const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
示例
const firstTwoMax = ary(Math.max, 2); [[2, 6, "a"], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]call
給定一個key和一組參數,給定一個上下文時調用它們。主要用于合并。
使用閉包調用上下文中key對應的值,即帶有存儲參數的函數。
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); // [1, 2, 3] (after about 2 seconds)flip
Flip以一個函數作為參數,然后把第一個參數作為最后一個參數。
返回一個可變參數的閉包,在應用其他參數前,先把第一個以外的其他參數作為第一個參數。
const flip = fn => (first, ...rest) => fn(...rest, first);
示例
let a = { name: "John Smith" }; let b = {}; const mergeFrom = flip(Object.assign); let mergePerson = mergeFrom.bind(null, a); mergePerson(b); // == b b = {}; Object.assign(b, a); // == bover
創建一個函數,這個函數可以調用每一個被傳入的并且才有參數的函數,然后返回結果。
使用 Array.prototype.map() 和 Function.prototype.apply()將每個函數應用給定的參數。
const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));
示例
const minMax = over(Math.min, Math.max); minMax(1, 2, 3, 4, 5); // [1,5]overArgs
創建一個函數,它可以調用提供的被轉換參數的函數。
使用Array.prototype.map()將transforms應用于args,并結合擴展運算符(…)將轉換后的參數傳遞給fn。
const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val)));
示例
const square = n => n * n; const double = n => n * 2; const fn = overArgs((x, y) => [x, y], [square, double]); fn(9, 3); // [81, 6]pipeAsyncFunctions
為異步函數執行從左到右的函數組合。
在擴展操作符(…)中使用Array.prototype.reduce() 來使用Promise.then()執行從左到右的函數組合。
這些函數可以返回簡單值、Promise的組合,也可以定義為通過await返回的async值。
所有函數必須是一元的。
const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg));
示例
const sum = pipeAsyncFunctions( x => x + 1, x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)), x => x + 3, async x => (await x) + 4 ); (async() => { console.log(await sum(5)); // 15 (after one second) })();pipeFunctions
執行從左到右的函數組合。
在展開操作符(…)中使用Array.prototype.reduce()來執行從左到右的函數組合。
第一個(最左邊的)函數可以接受一個或多個參數; 其余的函數必須是一元的。
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); // 15promisify
把一個異步函數轉換成返回promise的。
使用局部套用返回一個函數,該函數返回一個調用原始函數的Promise。
使用的...操作符來傳入所有參數。
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 2srearg
創建一個調用提供的函數的函數,該函數的參數按照指定的索引排列。
利用 Array.prototype.map() 根據 indexes 和展開操作符 (...) 對參數進行重新排序,將轉換后的參數傳遞給 fn.
const rearg = (fn, indexes) => (...args) => fn(...indexes.map(i => args[i]));
示例
var rearged = rearg( function(a, b, c) { return [a, b, c]; }, [2, 0, 1] ); rearged("b", "c", "a"); // ["a", "b", "c"]spreadOver
接受一個可變參數函數并返回一個閉包,該閉包接受一個參數數組以映射到函數的輸入。
使用閉包和擴展操作符(…)將參數數組映射到函數的輸入。
const spreadOver = fn => argsArr => fn(...argsArr);
示例
const arrayMax = spreadOver(Math.max); arrayMax([1, 2, 3]); // 3unary
創建一個最多接受一個參數的函數,忽略任何其他參數。
只把第一個參數傳遞給要調用的函數fn。
const unary = fn => val => fn(val);
示例
["6", "8", "10"].map(unary(parseInt)); // [6, 8, 10]推薦閱讀
【React深入】setState的執行機制
【React深入】React事件機制
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102447.html
摘要:在社區開發的一些最新工具集的幫助下,出現了四步流程法,從而進一步加快了開發效率。兩步流程法傳統上來說,智能合約開發有兩步開發流程編碼和測試。四步工作流程法開發智能合約對于編輯和調試階段,我建議使用兩種方法和。 摘要:開發NEO智能合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測試(在測試網上部署、調用、檢查結果)。這個工作流需要編譯和部署來調試任...
摘要:在社區開發的一些最新工具集的幫助下,出現了四步流程法,從而進一步加快了開發效率。兩步流程法傳統上來說,智能合約開發有兩步開發流程編碼和測試。四步工作流程法開發智能合約對于編輯和調試階段,我建議使用兩種方法和。 摘要:開發NEO智能合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測試(在測試網上部署、調用、檢查結果)。這個工作流需要編譯和部署來調試任...
摘要:自己因為經常遇到這種場景,所以將其封裝成一個庫,方便使用。如何使用使用簡單,只需要要在方法上面加一個裝飾器即可緩存,并且設置緩存過期時間。以上即可,第一次運行需要秒,第二次運行過期時間秒之內瞬間給出緩存結果。適合于小場景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...
摘要:自己因為經常遇到這種場景,所以將其封裝成一個庫,方便使用。如何使用使用簡單,只需要要在方法上面加一個裝飾器即可緩存,并且設置緩存過期時間。以上即可,第一次運行需要秒,第二次運行過期時間秒之內瞬間給出緩存結果。適合于小場景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...
摘要:英文文章來源于給定一個鍵值和一組參數,但給定一個上下文時調用它們。 英文文章來源于:https://github.com/Chalarangelo/30-seconds-of-code/blob/master/README.md Adapter call 給定一個鍵值和一組參數,但給定一個上下文時調用它們。 使用閉包調用存儲的鍵值與存儲的參數 const call = ( key, ....
閱讀 3197·2021-11-08 13:18
閱讀 1353·2021-10-09 09:57
閱讀 1182·2021-09-22 15:33
閱讀 3960·2021-08-17 10:12
閱讀 5053·2021-08-16 11:02
閱讀 2676·2019-08-30 10:56
閱讀 962·2019-08-29 18:31
閱讀 3251·2019-08-29 16:30