Запутался в том, как связывать запросы, используя обещания, используя .then () - PullRequest
6 голосов
/ 15 июня 2019

Я просто не могу обернуться вокруг цепочки запросов обещаниями.Что меня больше всего смущает, так это часть .then (function (doSomething).

Что я должен добавить в функцию (doSomething)? И что это делает?эти запросы для меня без использования Promise.all, но вместо этого .then ()? Так что я могу извлечь из этого

SELECT * FROM books where book_id = $1

SELECT * FROM username where username = $2

SELECT * FROM saved where saved_id = $3

Ответы [ 3 ]

5 голосов
/ 15 июня 2019

function(doSomething) запускается, когда предыдущее обещание завершается успешно, а doSomething является ответом. Вы можете связать обещания, используя then, например:

query("SELECT * FROM books where book_id = $1")
  .then(() => query("SELECT * FROM username where username = $2"))
  .then(() => query("SELECT * FROM saved where saved_id = $3"));

Это выполнит три запроса SQL в последовательности.

Однако, поскольку вы, скорее всего, захотите сохранить ответ, вы можете использовать async/await для простоты:

async function threeQueries() {

  //Fetch all three queries in sequence
  let queryOne = await query("SELECT * FROM books where book_id = $1");
  let queryTwo = await query("SELECT * FROM username where username = $2");
  let queryThree = await query("SELECT * FROM saved where saved_id = $3");

  //Extract the response text from our queries
  let resultOne = await queryOne.text();
  let resultTwo = await queryTwo.text();
  let resultThree = await queryThree.text();

  //Return the responses from the function
  return [resultOne, resultTwo, resultThree];

}

Вы также можете использовать Promise.all примерно так:

Promise.all([
  query("SELECT * FROM books where book_id = $1"), 
  query("SELECT * FROM username where username = $2"), 
  query("SELECT * FROM saved where saved_id = $3")
]);
3 голосов
/ 15 июня 2019

Цель Promises - обеспечить лучшее управление потоком асинхронных операций. Используйте Promise.all для случаев, когда у вас есть несколько задач, которые должны быть выполнены в любом порядке, прежде чем поток кода сможет продолжаться. Используйте Promise.then, если у вас есть несколько асинхронных задач, каждый шаг которых может частично зависеть от результата предыдущего (например, после запроса таблицы книг вы запрашиваете таблицу имен пользователей, используя books.savedByUserId, чтобы получить соответствующую запись пользователя).

Ссылка на некоторые примеры из: https://codeburst.io/node-js-mysql-and-promises-4c3be599909b Автор предоставляет простую оболочку mySql, которая возвращает Promises (database.query возвращает новое Promise).

//In this example Promise.all executes the queries independently, but provides an
//effective tool to resume your work after all are completed. The order in which
//they complete may be random/indeterminate.
var bookQuery = database.query( 'SELECT * FROM books where book_id = $1' );
var userQuery = database.query( 'SELECT * FROM username where username = $2' );
var saveQuery = database.query( 'SELECT * FROM saved where saved_id = $3' );

Promise.all([bookQuery,userQuery,saveQuery]).then(function(results){
    //resume whatever processing that should happen afterwards
    //For instance, perhaps form fields in your UI require these datasets to be loaded
    //before displaying the UI.
    myDialog.open()
});

// In this example, things are done sequentially, this makes the most sense 
// when the result of each operation feeds into the next. Since your queries don't
// rely on each other, this is not ideally depicted.
let bookRows, userRows, savedRows ;
database.query( 'SELECT * FROM books where book_id = $1' )
    .then( rows => {
        bookRows = rows;
        return database.query( 'SELECT * FROM username where username = $2' );
    })
    .then( rows => {
        userRows = rows;
        return database.query( 'SELECT * FROM saved where saved_id = $3' );
    })
    .then( rows => {
        savedRows = rows;
        return database.close();
    })
    .then( () => {
        // do something with bookRows, userRows, savedRows
    }
    .catch( err => {
        // handle the error
    })

p.s. Не для мутности, но в этом случае три последовательных SQL-запроса, вероятно, могут быть заменены одним запросом с объединениями, но я думаю, что это не совсем вопрос. Давайте представим, что это три запроса к отдельным магазинам, это имело бы смысл.

1 голос
/ 15 июня 2019

Мы используем обещания, которые являются объектами, которые могут дать одно значение в будущем.

При запуске query("query string") он будет возвращать объект Promise асинхронно. Это значит, что ваше приложение не будет ждать завершения запроса. Он собирается запустить процесс запроса и перейти к следующей строке кода.

Итак, как нам обработать запрос, когда он будет выполнен?

Мы используем then для обработки информации, возвращаемой запросом. then сработает, когда запрос успешно завершит свой процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...