NodeJS, несколько if может возвращать заголовки (и не удается) - PullRequest
0 голосов
/ 15 мая 2018

Обновлено с примером Promise.

Я использую NodeJS, и у меня возникают проблемы с несколькими if -статементами и return -состояниями. Я пытаюсь использовать Promise, может показаться, что это путь.

Это мой пример кода:

const express = require('express');
const app = express();
const pgPromise = require('pg-promise')();

const db = pgPromise(CONNECTION_STRING);

app.use((req, res) => {

    var message = "";


    promise1 = new Promise((resolve, reject) => {
        message += "promise1";
        if (false) {
            reject(message);
        }
    });


    promise2 = new Promise((resolve, reject) => {
        if (true) {
            db.one('SELECT 1')
                .then(row => {
                    message += " promise2";
                    resolve(message);
                })
                .catch(err => {
                    message += " error";
                    reject(message);
                });
        }
    });

    var printResult = (results) => {console.log("Results = ", results, "message = ", message)}

    Promise.all([promise1, promise2]).then(printResult);

    return res.json({ message: message });
});

app.listen(3000);

Кажется, он не ждет, пока Promise 2 завершит запрос к базе данных.

Как я могу убедиться, что запрос к базе данных выполнен перед возвратом какого-либо оператора?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Выполнение кода не прекращается на Promise.all, необходимо переместить оператор return в обратный вызов Promise.all и вернуть Promise, возвращенный Promise.all.

return Promise.all([promise1, promise2]).then(() => {
  printResult();
  return res.json({ message: message });
});
0 голосов
/ 15 мая 2018

Поскольку узел JS работает асинхронно, он не ожидает завершения ввода1, inpu2, input3 перед выполнением последней строки (возврат res.json ({error: false});).

Вам нужно использовать Promise для обработки последовательности. Найдите код ниже.

let input1 = new Promise(function (resolve, reject) {
  if (typeof req.body.input1 != "undefined") {
    // do something
    resolve('Success');
  } else {
    reject('Error');
  }
});

let input2 = new Promise(function (resolve, reject) {
  if (typeof req.body.input2 != "undefined") {
    // do something
    resolve('Success');
  } else {
    reject('Error');
  }
});

let input3 = new Promise(function (resolve, reject) {
  if (typeof req.body.input3 != "undefined") {
    // do something
    resolve('Success');
  } else {
    reject('Error');
  }
});


input1.then((value) => {
  return res.json({ error: true });
})
  .catch((e) => {
    input2.then((value) => {
      return res.json({ error: true });
    })
      .catch((e) => {
        input3.then((value) => {
          return res.json({ error: true });
        })
          .catch((e) => {
            return res.json({ error: false });
          })
      })
  })

Если вы хотите обрабатывать все входы асинхронно, используйте обещание .all ().

...