2016-10-31 9 views
0

У меня есть вопрос об асинхронной функции. Вот моя функция «My_function»:Асинхронная функция - node.js

function My_function (my_name, callback){ 
     stmt = db.prepare ("SELECT number_table1 from my_table1 WHERE user=?"); 
     stmt.bind(my_name); 
     stmt.get(function(error,row){ 
      if(error){ 
      throw err; 
      } 
      else{ 
      if(row){ 
       callback(number_table1); 
      } 
      else{ 
       console.log("error"); 
      } 
      } 
     }); 
    } 

Работа хорошо, но у меня есть 2 таблицы, и мне нужно сделать другой запрос, и мне нужно добавить два числа так ... в моей функции мне нужно сделать тоже этот вопрос:

stmt = db.prepare ("SELECT number_table2 from my_table2 WHERE user=?"); 

и, наконец, вернуться в мой обратный вызов «number_table1 + number_table2». Кто-нибудь знает, как его решить? Заранее спасибо.

С уважением!

ответ

0

В таких случаях, как я, мне нравится использовать модуль async, потому что код будет более разборчивым. Пример:

var async = require('async'); 

function My_function(my_name, callback) { 
    var stmt = db.prepare("SELECT number_table1 from my_table1 WHERE user=?"); 
    stmt.bind(my_name); 
    stmt.get(function (error, row) { 
    if (error) { 
     callback(error, null); 
    } else { 
     if (row) { 
     callback(null, number_table1); 
     } else { 
     callback(new Error("row not found"), null); 
     } 
    } 
    }); 
} 

//if you need the results in a specific order, you can use "series" instead of "parallel". 
async.parallel(
    //array of functions 
    [ 
    function (callback) { 
     My_function('firstName', callback); 
    }, 
    function (callback) { 
     My_function('secondName', callback); 
    } 
    ], 

    //results when all functions ends 
    //the results array will equal [number_table1, number_table2], but the order can be different, because of the parallelism 
    function (err, results) { 
    if (err) { 
     //handle the err 
    } else { 
     //do something 
    } 
    } 
); 

Docs:

+0

Спасибо, что ответили мне, но мне нужен правильный порядок в моих данных, потому что мне нужно выполнять более сложные операции: S – Tecnico

0

Вам необходимо синхронизировать функции, так что вы можете быть уверены, что оба их результаты будут готовы до обратного вызова. Вы можете сделать это с помощью обещаний: https://www.promisejs.org/

  • Сделайте две обычные функции (нет обратных вызовов), по одному для каждого запроса (FUNCTION1, Function2)
  • сделать и вернуть обещание
  • Затем вы можете сделать

    function My_function(my_name) { 
        var value1; 
        function1(my_name) 
         .then(function(resultFromFunction1) { 
          value1 = resultFromFunction1; 
          return function2(my_name); 
         }) 
         .then(function(resultFromFunction2) { 
          var result = value1 + resultFromFunction2; 
          return result; 
         }); 
        } 
    } 
    

Убедитесь, что отлавливать ошибки и обрабатывать различные результаты, что я представил является простейшей формой.

Update

Вот пример функции делает запрос и возвращающегося обещание

function1 = function(user) { 
    return new Promise(function (resolve, reject) { 

     pool.getConnection(function (err, connection) { 
      if(err) { 
       reject ({status : false, message : "Error in connection database"}); 
      } else { 
       connection.query('SELECT number_table1 from my_table1 WHERE user=?', [user], function(err, rows){ 
        connection.release(); 
        if(!err) { 
         resolve ({status: true, message: rows}); 
        } else { 
         reject ({status: false, message: err}); 
        } 
       }); 
      } 
     }); 
    }); 
} 
+0

Aidin, спасибо за ответ, но я новичок в асинхронном программировании и не слишком хорошо понимаю. Я не уверен, как вернуть обещание от моей функции. Если вы не возражаете, не могли бы вы написать, как бы это был весь код? Для возврата обещание в моей функции будет выглядеть следующим образом: функция function1() { вернуть новый Promise ( функцией (решительность, отвергает) { ... решительности (результат); }); } Спасибо за помощь! :) – Tecnico

+0

@Tecnico Я новичок, но вот пример того, как я это делаю. Мне жаль, но на данный момент я не могу привести лучший пример.Любой, кто знает более подходящий пример, может свободно редактировать. – Aidin

+0

@Tecnico Недавно я задал вопрос обещания, потому что не знал, как это сделать. Вы можете прочитать это здесь. Ответ действительно хорош, поэтому, возможно, вы также можете получить что-то от него. http://stackoverflow.com/questions/39691647/nodejs-express-and-promises-not-doing-what-i-expect – Aidin

-1

Сделать параметры функции имен таблиц. Преобразуйте эту функцию для использования async/await или обещайте. Используйте Promise.all для запуска обоих запросов.

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