2017-01-31 3 views
0

Я очень стараюсь модулизовать свой код, и до сих пор сделал это, избегая обратного обращения. Одна вещь, которая раздражает меня, как, когда я прохожу в функции обратного вызова, он должен быть вызван из Нонс функции обратного вызова, например, такДолжны ли быть вызваны вызовы node.js в функции nonce? Если да, то почему?

paramQuery(query, params, callback){ 
    this.Handle.getConnection(function(err, Connection){ 

     Connection.query(query, params, function(error, results, rows){    
      callback(error, results, rows); <-- this crap right here 
     }); 

     Connection.release(); 
    }); 
} 

Нужно вызвать функцию обратного вызова в нонса ВСЕ ВРЕМЯ? Если я уже определил обратный вызов в другом месте, почему я не могу просто передать его по цепочке?

paramQuery(query, params, callback){ 
    this.Handle.getConnection(function(err, Connection){ 
     if(err){ 
      console.error("Could not connect to the Database:\n\n" + err.stack); 
      process.exit(1); 
     } 

     Connection.query(query, params, callback(error, results, rows)); <-- Much cleaner 

     Connection.release(); 
    }); 
} 
+1

потому что .. вы вызываете callbak немедленно, а не передаете как функцию для запроса? потерять '(...)', 'Connection.query (запрос, параметры, обратный вызов)' * Much cleaner * –

+0

Это имеет смысл. Спасибо –

ответ

1

Вы можете передать обратный вызов переменной (аргумент) от вызывающего на вложенную функцию без объявления новой функции или ее выполнения. Возьмите этот простой пример:

var func1 = function(arg, cb) { 
    func2(arg * 100, cb) 
} 

var func2 = function(arg, cb) { 
    cb(arg * 20) 
} 

func1(4, function(result) { 
    console.log(result) 
    // 8000 
}) 

Разница в вашем примере является то, что вы были выполнения обратного вызова (callback()), а не просто передать его в качестве параметра (callback):

paramQuery(query, params, callback){ 
    this.Handle.getConnection(function(err, Connection){ 
     Connection.query(query, params, callback); 
     Connection.release(); 
    }); 
} 
+1

Не уверен, что это значит для ¯ \\ _ (ツ) _/¯ – brandonscript

+0

Меня тоже. Плюс один для объяснения, хотя –

+1

У меня тоже один, кто-то злится на обратные вызовы :) – Matt

0

Если функция, которую вы создаете и вызываемая функция имеет ту же сигнатуру, то вам не нужно обернуть функцию, вы можете передать самой функцию. В вашем случае они оба (error, results, rows) так это будет работать:

paramQuery(query, params, callback){ 
    this.Handle.getConnection(function(err, Connection){ 
     if(err){ 
      console.error("Could not connect to the Database:\n\n" + err.stack); 
      process.exit(1); 
     } 

     Connection.query(query, params, callback); 

     Connection.release(); 
    }); 
} 

Если вы прошли callback(error, whatever) в Connection.query как предложено, то функция будет вызвана немедленно, и результат этой функции передается в качестве аргумента в Connection.query

+0

Хотя ваш ответ правильный, я принял @brandonscript, потому что его немного легче понять. Ничего личного. –

+1

Конечно, в этом весь смысл сайта! – Matt

Смежные вопросы