如何在JavaScript Promise中将结果从一个then()块传递到下一个then()块?

时间:2019-10-28 13:22:16

标签: javascript node.js promise axios

我想从一个GET请求中进行2个MySQL查询,将结果编织在一起并返回它们。但是我很难将第一个查询的结果传递到下一个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 个答案:

答案 0 :(得分:2)

问题是您的查询调用不会返回promise,而只是在完成后才调用回调。如果您使用的任何数据库库均不支持返回承诺,那么建议您为查询方法创建包装函数以返回承诺。它将使它们链接成承诺要容易得多。

类似这样的东西:

function queryPromise(con, sql) {
    return new Promise((resolve, reject) => {
      con.query(sql, (err, result) => {
        if (err) { return reject(err); }
        return resolve(result);
      });
    });
}

答案 1 :(得分:0)

要从一个.then返回到下一个.then,则应从previous返回值。您的代码无法正常工作,因为您要从回调函数返回结果。您无法从回调函数返回值。

检查您的.query函数是否返回任何承诺。如果是,那么您应该执行类似const result = awati con.query(sql);的操作。

或者,您可以对.query函数进行赋值处理,然后等待它。

答案 2 :(得分:0)

使用return关键字返回then()块内的结果。这应该是下一个块可用的数据。

请记住,如果需要按顺序执行then块,则需要返回一个Promise而不是已解析的值