【问题标题】:NodeJS, multiple if may return headers (and fails)NodeJS,多个 if 可能会返回标头(并且失败)
【发布时间】:2018-05-15 09:15:47
【问题描述】:

更新了 Promise 示例。

我正在运行 NodeJS,但遇到了多个 if-statements 和 return-statements 的问题。 我正在尝试使用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 完成数据库查询。

如何确保在返回任何语句之前完成数据库查询?

【问题讨论】:

  • 那个代码不会有那个效果。您需要提供minimal reproducible example
  • 考虑回答此问题的人,请注意,有 3 人发布了未能说明问题中的返回语句的答案(在发表此评论时已删除了 2 人)。
  • 还没有有用的答案 - 所以欢迎所有答案。
  • 你还没有提供minimal reproducible example
  • 尝试更新整个问题,以便更容易理解挑战。

标签: javascript node.js express if-statement


【解决方案1】:

代码执行不会在 Promise.all 上停止,需要将 return 语句移到 Promise.all 回调中,并返回 Promise.all 返回的 Promise。

return Promise.all([promise1, promise2]).then(() => {
  printResult();
  return res.json({ message: message });
});

【讨论】:

    【解决方案2】:

    由于 Node JS 是异步运行的,它不会在执行最后一行之前等待 input1、inpu2、input3 完成(return 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 });
              })
          })
      })
    

    如果要异步处理所有输入,请使用 promise.all()。

    【讨论】:

    • “由于 Node JS 是异步运行的”——Node.JS 不会异步运行。有些功能可以。 res.json 不是其中之一。
    • 似乎不能解决问题 - 如果 input1 未定义,它会返回错误 - 它不应该。它应该继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多