Как передать результат из одного блока then () в следующий блок then () в JavaScript Promise? - PullRequest
0 голосов
/ 28 октября 2019

Я хочу сделать 2 MySQL-запроса из одного GET-запроса, связать результаты и вернуть их. Но я с трудом передаю результат первого запроса в следующий блок then ().

const express = require('express');
const router = express.Router();
const axios = require('axios');
const con = require('../../db');

router.get('/:id', (req, res, next) => {
axios.get('/').then(docs => { //get one book by its id number
    const sql = "SELECT title, line, mage_edition FROM books WHERE id=" + req.params.id;
    con.query(sql, (err, result) => {
        if (err) {
            throw err;
        }
        return result; //"result" shows proper value here
    });
}).then(docs => { //get all the listings that appear inside that book
    //How do I get "result" here?
    const sql2 = "SELECT l.entry_id, e.title, e.kind, e.sort FROM links l INNER JOIN entries e ON l.entry_id = e.id WHERE book_id=" + req.params.id;
    con.query(sql2, (err, result2) => {
        if (err) {
            throw err;
        }
        //combine result and result2, then give back with res.status(200).json()
    })
});
});
module.exports = router;

Любая помощь будет принята с благодарностью. Я закончил серию обучающих видео по асинхронному JavaScript, но я не могу понять это.

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

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

Примерно так:

function queryPromise(con, sql) {
    return new Promise((resolve, reject) => {
      con.query(sql, (err, result) => {
        if (err) { return reject(err); }
        return resolve(result);
      });
    });
}
0 голосов
/ 28 октября 2019

используйте ключевое слово return, чтобы вернуть результат в блоке then(). Это должны быть данные, доступные для следующего блока.

Имейте в виду, что если вам нужно выполнить по порядку выполнение блоков then, вам нужно будет вернуть Promise вместо разрешенных значений

0 голосов
/ 28 октября 2019

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

Проверьте, возвращает ли ваша функция .query какое-либо обещание или нет. Если да, то вы должны сделать что-то вроде этого const result = awati con.query(sql);.

Или вы можете обещать свою функцию .query и затем ждать ее.

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