成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【30秒一個(gè)知識(shí)點(diǎn)】Adapter

鄒立鵬 / 2334人閱讀

摘要:給定一個(gè)函數(shù),返回一個(gè)閉包,該閉包將所有輸入收集到一個(gè)數(shù)組接受函數(shù)中。返回一個(gè)可變參數(shù)的閉包,在應(yīng)用其他參數(shù)前,先把第一個(gè)以外的其他參數(shù)作為第一個(gè)參數(shù)。

本系列翻譯自開(kāi)源項(xiàng)目 30-seconds-of-code

這是一個(gè)非常優(yōu)秀的系列,文章總結(jié)了大量的使用es6語(yǔ)法實(shí)現(xiàn)的代碼模塊不是說(shuō)真的三十秒就能理解,也需要你認(rèn)真的思考,其中有一些點(diǎn)非常精妙,很值得一讀。

本文在我的github同步更新,你可以看到當(dāng)前翻譯的全部系列。

如果您對(duì)本期有不同或者更好的見(jiàn)解,請(qǐng)?jiān)谙路皆u(píng)論告,喜歡請(qǐng)點(diǎn)個(gè)贊,謝謝閱讀。

ary

創(chuàng)建一個(gè)可以接收n個(gè)參數(shù)的函數(shù), 忽略其他額外的參數(shù)。

調(diào)用提供的函數(shù)fn,參數(shù)最多為n個(gè), 使用 Array.prototype.slice(0,n) 和展開(kāi)操作符 (...)。

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

給定一個(gè)key和一組參數(shù),給定一個(gè)上下文時(shí)調(diào)用它們。主要用于合并。

使用閉包調(diào)用上下文中key對(duì)應(yīng)的值,即帶有存儲(chǔ)參數(shù)的函數(shù)。

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

將一個(gè)接收數(shù)組參數(shù)的函數(shù)改變?yōu)榭勺儏?shù)的函數(shù)。

給定一個(gè)函數(shù),返回一個(gè)閉包,該閉包將所有輸入收集到一個(gè)數(shù)組接受函數(shù)中。

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以一個(gè)函數(shù)作為參數(shù),然后把第一個(gè)參數(shù)作為最后一個(gè)參數(shù)。

返回一個(gè)可變參數(shù)的閉包,在應(yīng)用其他參數(shù)前,先把第一個(gè)以外的其他參數(shù)作為第一個(gè)參數(shù)。

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); // == b
over

創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)可以調(diào)用每一個(gè)被傳入的并且才有參數(shù)的函數(shù),然后返回結(jié)果。

使用 Array.prototype.map()Function.prototype.apply()將每個(gè)函數(shù)應(yīng)用給定的參數(shù)。

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

創(chuàng)建一個(gè)函數(shù),它可以調(diào)用提供的被轉(zhuǎn)換參數(shù)的函數(shù)。

使用Array.prototype.map()transforms應(yīng)用于args,并結(jié)合擴(kuò)展運(yùn)算符()將轉(zhuǎn)換后的參數(shù)傳遞給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

為異步函數(shù)執(zhí)行從左到右的函數(shù)組合。

在擴(kuò)展操作符()中使用Array.prototype.reduce() 來(lái)使用Promise.then()執(zhí)行從左到右的函數(shù)組合。
這些函數(shù)可以返回簡(jiǎn)單值、Promise的組合,也可以定義為通過(guò)await返回的async值。
所有函數(shù)必須是一元的。

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

執(zhí)行從左到右的函數(shù)組合。

在展開(kāi)操作符()中使用Array.prototype.reduce()來(lái)執(zhí)行從左到右的函數(shù)組合。
第一個(gè)(最左邊的)函數(shù)可以接受一個(gè)或多個(gè)參數(shù); 其余的函數(shù)必須是一元的。

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

把一個(gè)異步函數(shù)轉(zhuǎn)換成返回promise的。

使用局部套用返回一個(gè)函數(shù),該函數(shù)返回一個(gè)調(diào)用原始函數(shù)的Promise。
使用的...操作符來(lái)傳入所有參數(shù)。

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
rearg

創(chuàng)建一個(gè)調(diào)用提供的函數(shù)的函數(shù),該函數(shù)的參數(shù)按照指定的索引排列。

利用 Array.prototype.map() 根據(jù) indexes 和展開(kāi)操作符 (...) 對(duì)參數(shù)進(jìn)行重新排序,將轉(zhuǎn)換后的參數(shù)傳遞給 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

接受一個(gè)可變參數(shù)函數(shù)并返回一個(gè)閉包,該閉包接受一個(gè)參數(shù)數(shù)組以映射到函數(shù)的輸入。

使用閉包和擴(kuò)展操作符()將參數(shù)數(shù)組映射到函數(shù)的輸入。

const spreadOver = fn => argsArr => fn(...argsArr);

示例

const arrayMax = spreadOver(Math.max);
arrayMax([1, 2, 3]); // 3
unary

創(chuàng)建一個(gè)最多接受一個(gè)參數(shù)的函數(shù),忽略任何其他參數(shù)。

只把第一個(gè)參數(shù)傳遞給要調(diào)用的函數(shù)fn

const unary = fn => val => fn(val);

示例

["6", "8", "10"].map(unary(parseInt)); // [6, 8, 10]
推薦閱讀

【React深入】setState的執(zhí)行機(jī)制

【React深入】React事件機(jī)制

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102447.html

相關(guān)文章

  • 開(kāi)發(fā)NEO智能合約的步驟流程

    摘要:在社區(qū)開(kāi)發(fā)的一些最新工具集的幫助下,出現(xiàn)了四步流程法,從而進(jìn)一步加快了開(kāi)發(fā)效率。兩步流程法傳統(tǒng)上來(lái)說(shuō),智能合約開(kāi)發(fā)有兩步開(kāi)發(fā)流程編碼和測(cè)試。四步工作流程法開(kāi)發(fā)智能合約對(duì)于編輯和調(diào)試階段,我建議使用兩種方法和。 摘要:開(kāi)發(fā)NEO智能合約的典型開(kāi)發(fā)流程有兩個(gè)實(shí)際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測(cè)試(在測(cè)試網(wǎng)上部署、調(diào)用、檢查結(jié)果)。這個(gè)工作流需要編譯和部署來(lái)調(diào)試任...

    I_Am 評(píng)論0 收藏0
  • 開(kāi)發(fā)NEO智能合約的步驟流程

    摘要:在社區(qū)開(kāi)發(fā)的一些最新工具集的幫助下,出現(xiàn)了四步流程法,從而進(jìn)一步加快了開(kāi)發(fā)效率。兩步流程法傳統(tǒng)上來(lái)說(shuō),智能合約開(kāi)發(fā)有兩步開(kāi)發(fā)流程編碼和測(cè)試。四步工作流程法開(kāi)發(fā)智能合約對(duì)于編輯和調(diào)試階段,我建議使用兩種方法和。 摘要:開(kāi)發(fā)NEO智能合約的典型開(kāi)發(fā)流程有兩個(gè)實(shí)際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測(cè)試(在測(cè)試網(wǎng)上部署、調(diào)用、檢查結(jié)果)。這個(gè)工作流需要編譯和部署來(lái)調(diào)試任...

    zhou_you 評(píng)論0 收藏0
  • 一個(gè)輕量級(jí) Python 裝飾器的緩存庫(kù)——wrapcache

    摘要:自己因?yàn)榻?jīng)常遇到這種場(chǎng)景,所以將其封裝成一個(gè)庫(kù),方便使用。如何使用使用簡(jiǎn)單,只需要要在方法上面加一個(gè)裝飾器即可緩存,并且設(shè)置緩存過(guò)期時(shí)間。以上即可,第一次運(yùn)行需要秒,第二次運(yùn)行過(guò)期時(shí)間秒之內(nèi)瞬間給出緩存結(jié)果。適合于小場(chǎng)景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...

    馬永翠 評(píng)論0 收藏0
  • 一個(gè)輕量級(jí) Python 裝飾器的緩存庫(kù)——wrapcache

    摘要:自己因?yàn)榻?jīng)常遇到這種場(chǎng)景,所以將其封裝成一個(gè)庫(kù),方便使用。如何使用使用簡(jiǎn)單,只需要要在方法上面加一個(gè)裝飾器即可緩存,并且設(shè)置緩存過(guò)期時(shí)間。以上即可,第一次運(yùn)行需要秒,第二次運(yùn)行過(guò)期時(shí)間秒之內(nèi)瞬間給出緩存結(jié)果。適合于小場(chǎng)景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...

    gekylin 評(píng)論0 收藏0
  • 30-seconds-code——adapter

    摘要:英文文章來(lái)源于給定一個(gè)鍵值和一組參數(shù),但給定一個(gè)上下文時(shí)調(diào)用它們。 英文文章來(lái)源于:https://github.com/Chalarangelo/30-seconds-of-code/blob/master/README.md Adapter call 給定一個(gè)鍵值和一組參數(shù),但給定一個(gè)上下文時(shí)調(diào)用它們。 使用閉包調(diào)用存儲(chǔ)的鍵值與存儲(chǔ)的參數(shù) const call = ( key, ....

    dcr309duan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<