簡體   English   中英

JavaScript 樣式用於可選回調

[英]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();

如果提供了回調,我更喜歡調用回調,無論它是什么類型。 不要讓它默默地失敗,所以實現者知道他傳入了一個不正確的參數並且可以修復它。

ECMAScript 6

// @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM