在 node.js 中使用 ES6 promise 返回空响应

Returning empty response using ES6 promise in node.js

如何在 node.js 中使用 ES6 原生承诺调用查询。下面是代码。

let arr= [];
    conn.query('select * from table1', (err, b) => {
    for (let i = 0; i < b.length; i++) {
        console.log(b[i]["id"])
        let promiseGetData = new Promise((resolve, reject) => {
            conn.query('select * from table2 where id = ?', [b[i]["id"]], (err, ce) => {
                if (err) {
                    const response = {
                        statusCode: 500,
                        body: JSON.stringify({
                            message: err
                        }),
                    }
                    reject(response);
                } else {
                    if (ce.length != 0) {
                        resolve(ce);
                    }
                }
            });
        });

        promiseGetData .then((data) => {
            b[i]['data'] = data;
            arr.push(b[i])
        }).catch((err) => {
            console.log(err);
        });
    }
console.log(b)
    })

当我执行 console.log(b) 时,我看到一个空的响应。我不知道我是否以正确的方式使用了承诺,我认为对于第一个查询我也应该在承诺中执行。非常感谢任何帮助

您从 console.log(b) 得到空响应,因为查询数据库的承诺尚未完成。您必须等待所有这些都完成才能获得完整结果。

样本:

let arr = [];
conn.query('select * from table1', (err, b) => {

  var promiseArr = [];

    for (let i = 0; i < b.length; i++) {
        let promiseGetData = new Promise((resolve, reject) => {
            conn.query('select * from table2 where id = ?', [b[i]["id"]], (err, ce) => {
                if (err) {
                    const response = {
                        statusCode: 500,
                        body: JSON.stringify({
                            message: err
                        }),
                    }
                    reject(response);
                } else {
                    if (ce.length != 0) {
                        resolve(ce);
                    }
                }
            });
        });

            promiseArr.push(promiseGetData);
    }

    Promise.all(promiseArr).then((resultArr) => {
        //resultArr is all the resolved value returned from the promise in promiseArr
        for (let i = 0; i < resultArr.length; i++) {
            b[i]['data'] = resultArr[i];
            arr.push(b[i]);
        }
    }).then(() => {
        console.log(arr);
    }).catch((err) => {
        //if any promise throw/reject with error, it will go here directly
            console.log(err);
    });
})

编辑: 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

将基于异步回调的函数包装到 Promise 中称为 Promisifying

您当然可以为此使用库,但基本上它的作用是:

const queryAsPromise = function( ...args ) {
    return new Promise( function( resolve, reject ) {
       try { 
           conn.query(...args, function( error, result ) {
               if ( error ) { 
                   reject( error );
               } else {
                   resolve( result );
               }
           } ); 
       } catch( error ) {
           reject( error );
       }
    } )
} );

通过这样做一次,您将保持代码干爽,并且您现在可以随时使用该承诺进行查询:

queryAsPromise('select * from table1')
     .then( result => {
          return Promise.all(
              result.map( b => {
                 return queryAsPromise('select * from table2 where id = ?', b["id"])
                             .then( data => b["data"] = data )
              } )
          )
     )
     .catch( err => res.send(500) )
     .then( console.log )