当前位置: 首页 > 知识库问答 >
问题:

NodeJS,多个if可能返回头(并且失败)

太叔京
2023-03-14

更新了Promise示例。

我正在运行NodeJS,并且在多个if-语句和return-语句中遇到问题。我正在尝试使用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);

它似乎没有等待Promise2完成数据库查询。

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

共有2个答案

萧凡
2023-03-14

因为Node JS是异步运行的,所以它不会在执行最后一行之前等待input1、inpu2、input3完成(返回res.json({错误: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。全部()。

訾晋
2023-03-14

代码的执行不会因为promise而停止。总之,您需要将return语句移动到Promise。全部收回,并归还promise返回的promise。全部的

return Promise.all([promise1, promise2]).then(() => {
  printResult();
  return res.json({ message: message });
});
 类似资料:
  • 我使用Apache POI v3.12有以下问题:我需要使用49行[0…48]的XLSX文件作为模板,用数据填充它的单元格并将其写成不同的文件,这样我就可以再次重用模板。我正在做的大约是这样的: /稍后/ 经过调试,getRow()返回null,但是尝试。createRow()失败,原因是: 我在这里错过了什么吗?据我在 Apache 文档和论坛中读到的,如果 getRow() 返回 null,我

  • 我正在从第三方网站(家庭用电)检索JSON,根据我从网站请求的内容,返回的JSON可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(由于尺寸大,结果被截断): 其中 gwrcmd 是单个元素。 但是如果我要求过去半个小时的用电,我会得到这个: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个类似这样的结构(再次,被截断,因为它持续了一段时间。“版本”下有更

  • 因为我没学过c语言,标题可能有许多错误,请见谅。 我用electron开发一个桌面软件,需要获取exe文件的图标(不要app.getFileIcon这东西),在网上找了一圈没有可用的。最理想的是extracticon.exe,但它只能生成png文件 我需要ReadableStream 或 Buffer Electron: [c#] exeToPng.exe: 参考ExtractIcon源码 如果返

  • 如何使用java8流过滤列表,如果找到的元素是过滤列表中唯一的元素,则返回该元素,否则(如果有更多的元素满足条件,或者没有满足条件的结果)返回例如 我需要这样的东西: 但我想知道我是否可以在一个单一的流中做到这一点? 有单一的流解决方案吗?

  • 我正在尝试使用数据库的第一个图像设置ImageView。由于某种原因,它不起作用,我不知道为什么。方法loadImage在不同的类中调用。 我还试着用一个单独的方法设置图像,但我需要在创建整个舞台场景等的同时调用它,即使从第二个方法那样调用它,它也不起作用。 这是持有setImage的类 当调用时,设置图像会给我一个null值,imageview的默认值为null,但实际上我正在加载一个图像,甚至

  • 我用的是parse.com。每个包里面都有很多钻子,每个品类里面都有很多包。 我卡住了。然后(函数(result,result2,result3)在最后一行。promise可以有多个promise,它是可变的。有没有一种方法可以写出如下内容: 谢谢!