2017-12-22 30 views
0

私はこのコールバック関数callbackPrinterと私が取り組んでいるNode.jsプロジェクトでその使い方を知りました。具体的には、具体的にはcb.apply(cb, arguments)を参照してください。Node/JS:奇妙な入れ子にされたコールバック関数

callbackPrinterさんは何をしているのですか?それは単純化できますか?メッセージのロギング以外は何をしていますか?

使用:

function someFunction(callback) { 
    ... 
    async.parallel([ 
    // Some stuff 
    ], callbackPrinter(message, callback)) 
    ... 
} 

機能:、cbとして提供this

apply()方法は、所与のthis値を持つ関数を呼び出し、argumentsアレイである

function callbackPrinter (message, cb) { 
    return function (err) { 
    if (err) { return cb.apply(cb, arguments) } 

    // Some code to log message 

    cb.apply(cb, arguments) 
    } 
} 

答えて

0

argumentsであります配列(または配列のようなオブジェクト) 。

再:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

だから、そこに二回、最初のものは条件付きでコールバックが返され、第二のものを行い、その後、コールバックがあり、それを呼び出すapplyを取得します。

注記argumentsオブジェクトは、関数に渡される引数に対応するArray-likeオブジェクトです。ここから:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/argumentsです..apply()は、動作する配列のようなオブジェクトを受け入れます。

callbackPrinter
0

機能はerror-first callback functionを取り、原稿をラップし、コールバックがerrなしで呼び出された場合には、さらに、所定のmessageをログに記録し、新たな機能を返します。

簡略化できますか?おそらく、使用しているNode.jsのバージョンが十分新しい場合です。 (あなたのコードベースのコールバックが、現在実行中の関数への参照であるthisを奇妙に使用していない場合、Function.apply()の最初の引数としてcbを渡すと、通常はundefinedを渡します)。非常に多くの

function callbackPrinter (message, cb) { 
    return (err, ...args) => { 
    if (!err) { 
     // log message… 
    } 
    return cb(err, ...args) 
    } 
} 
0
  1. .applyを使用する場合には、あなたは正確に引数が構造体/実行時にカウントわからないです。あなたの場合、天気はerrになります。あなたのコードを理解
  2. ヘルプ:async.parallelが呼び出し、callbackPrinter実行機能を返す(function (err) {..})のとき

    1. 、返される関数はasync.parallelfinish/resolve triggerと結合します。
    2. async.parallelのすべての作業([ // Some stuff ])を(finished/resolved/rejected)で実行すると、返された関数が呼び出されます。
  3. 簡単な方法:

    const message = require('message'); 
     
    const async = require('async'); 
     
    
     
    function someFunction(callback) { 
     
         ... 
     
         async.parallel([ 
     
         // Some stuff 
     
         ], function(err){ 
     
          if (err) { return cb.apply(cb, arguments) } 
     
    
     
          // Some code to log message 
     
    
     
          cb.apply(cb, arguments) 
     
         }) 
     
         ... 
     
    }

関連する問題