Подождите, пока внутренние функции будут ждать и выполнять, а затем продолжить выполнение - PullRequest
0 голосов
/ 24 июня 2019

Я выполняю облачную функцию, которая написана в nodeJS. Здесь функция срабатывает, когда поступают данные из внешнего источника, и в этой функции мне нужно вызывать и проверять БД в конкретной таблице, но это занимает более 5 за несколько секунд до выполнения моей getDataFromDb функции моя основная функция завершила выполнение. Плюс есть функция с именем updateItems(postdate);, которая запускается, если я не могу найти данные в моей БД при запуске getDataFromDb

Я пробовал асинхронное ожидание, но я не уверен, где я делаю неправильно. моя функция всегда заканчивается раньше, чем завершается моя операция с БД.

  exports.handler = (event, context) => {

   //here i am making data ready for DB and checking for the record if that is present in db
        getDataFromDb(uniqueArray);

        function getDataFromDb(uniqueArray) {
          var params = {
            // params for get reques
          }
          //db get operation

          db.get(params, function (err, data) {
            //takes time here
            if (err) {
              console.log(err); // an error occurred
            }
            else {
             //another DB operation updateItems(postdata);
             //takes time here
              }
              else {
                console.log("first run for db")
                //another DB operation updateItems(postdata);
                //takes time here
              }
            }
          });
        }
      });
      console.log("main function ended")
    };

ожидаемый результат должен дождаться выполнения внутренней функции, а затем завершить основную функцию, но на самом деле основная функция завершается первой, а затем вызывающая функция БД завершается

1 Ответ

0 голосов
/ 24 июня 2019

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

exports.handler = (event, context) => {
  getDataFromDb(uniqueArray).then(success => {
    console.log('Done')
  })
  .catch(err => {
    console.log('handle get or post err here');
  });

  function getDataFromDb(uniqueArray) {
    var params = {};
    return new Promise((resolve, reject) => {
      db.get(params, (err, data) => {
        if (err) {
          return reject(err); // an error occurred
        } else {
          return resolve(data);
        }
      });
    }).then(success => updateItems(data))
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...