[英]JavaScript style for optional callbacks
我有一些函數偶爾(不總是)會收到回調並運行它。 檢查回調是否定義/功能是一種好的風格還是有更好的方法?
例子:
function save (callback){
.....do stuff......
if(typeof callback !== 'undefined'){
callback();
};
};
我個人更喜歡
typeof callback === 'function' && callback();
然而typeof
命令是狡猾的,應該只用於"undefined"
和"function"
typeof !== undefined
的問題是用戶可能傳入一個已定義的值而不是 function
你也可以這樣做:
var noop = function(){}; // do nothing.
function save (callback){
callback = callback || noop;
.....do stuff......
};
如果您碰巧在幾個地方使用callback
,它會特別有用。
此外,如果您使用的是jQuery
,那么您已經有一個像這樣的 function ,它被稱為$.noop
簡單地做
if (callback) callback();
如果提供了回調,我更喜歡調用回調,無論它是什么類型。 不要讓它默默地失敗,所以實現者知道他傳入了一個不正確的參數並且可以修復它。
// @param callback Default value is a noop fn.
function save(callback = ()=>{}) {
// do stuff...
callback();
}
一個有效的 function 基於 Function 原型,使用:
if (callback instanceof Function)
確保回調是 function
而不是使回調可選,只需分配一個默認值並無論如何調用它
const identity = x =>
x
const save (..., callback = identity) {
// ...
return callback (...)
}
使用時
save (...) // callback has no effect
save (..., console.log) // console.log is used as callback
這樣的風格稱為continuation-passing style 。 這是一個真實的例子, combinations
,它生成 Array 輸入的所有可能組合
const identity = x => x const None = Symbol () const combinations = ([ x = None, ...rest ], callback = identity) => x === None? callback ([[]]): combinations ( rest, combs => callback (combs.concat (combs.map (c => [ x, ...c ]))) ) console.log (combinations (['A', 'B', 'C'])) // [ [] //, [ 'C' ] //, [ 'B' ] //, [ 'B', 'C' ] //, [ 'A' ] //, [ 'A', 'C' ] //, [ 'A', 'B' ] //, [ 'A', 'B', 'C' ] // ]
因為combinations
是在延續傳遞風格中定義的,所以上面的調用實際上是相同的
combinations (['A', 'B', 'C'], console.log)
// [ []
// , [ 'C' ]
// , [ 'B' ]
// , [ 'B', 'C' ]
// , [ 'A' ]
// , [ 'A', 'C' ]
// , [ 'A', 'B' ]
// , [ 'A', 'B', 'C' ]
// ]
我們還可以傳遞一個自定義延續,它對結果執行其他操作
console.log (combinations (['A', 'B', 'C'], combs => combs.length))
// 8
// (8 total combinations)
繼續傳遞風格可以使用令人驚訝的優雅結果
const first = (x, y) => x const fibonacci = (n, callback = first) => n === 0? callback (0, 1): fibonacci ( n - 1, (a, b) => callback (b, a + b) ) console.log (fibonacci (10)) // 55 // 55 is the 10th fibonacci number // (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...)
我厭倦了一遍又一遍地看到同樣的片段,我寫了這個:
var cb = function(g) {
if (g) {
var args = Array.prototype.slice.call(arguments);
args.shift();
g.apply(null, args);
}
};
我有數百個函數在做類似的事情
cb(callback, { error : null }, [0, 3, 5], true);
管他呢...
我對整個“確保它的功能”策略持懷疑態度。 唯一合法的值是 function 或 falsy。 如果有人傳入一個非零數字或非空字符串,你會怎么做? 忽視問題如何解決?
我已經轉移到咖啡腳本,發現默認 arguments 是解決這個問題的好方法
doSomething = (arg1, arg2, callback = ()->)->
callback()
它可以通過ArgueJS輕松完成:
function save (){
arguments = __({callback: [Function]})
.....do stuff......
if(arguments.callback){
callback();
};
};
如果運行回調的標准是它是否定義,那么你很好。 另外,我建議另外檢查它是否真的是 function。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.