首页 > 解决方案 > 在 JavaScript+Node.js 中如何等待上一个 post 请求完成?

问题描述

我正在尝试在 JavaScript(客户端)中执行两个发布请求,但第二个请求似乎在第一个请求完成之前运行。

这是我的代码:

客户端代码:

$.post("/startGame", {username: username});
$.post("/lookingForAPlayer", {});

服务器端代码:

var idPlayer;
app.post('/startGame', function(req, res) {
    const idPlayerProm = new Promise((resolve, reject) => {
        dbConnection.getIdPlayer(req.body.username).then(data => {
            resolve(data)
        });
    });

    Promise.all([idPlayerProm]).then(data => {
        idPlayer = data[0];
        console.log("idPlayer1: " + idPlayer) //Here idPlayer has a value
        const gamePromise = new Promise((resolve, reject) => {
            dbConnection.addGame(idPlayer).then(data => {
                resolve(data);
            });
        });    
        Promise.all([gamePromise]).then(data => {
            idGame = data[0];
        });
    })   
});

app.post('/lookingForAPlayer', function(req, res) {
    console.log("idPlayer2: " + idPlayer); //Here idPlayer is undefined
});

结果:

在此处输入图像描述

如您所见,它甚至idPlayer2在应该在之后打印时首先打印idPlayer1

我猜我需要Promise在客户端做一些事情,但我不确定我是如何在客户端做这些事情的新手。

有什么帮助吗?

@DanMossa 的更新(我无法通过他/她的回答获得从服务器发送的值)。

app.post('/startGame', function(req, res) {
    dbConnection.getIdPlayer(req.body.username).then(data1 => {
        dbConnection.addGame(data1).then(data2 => {
            res.end(JSON.stringify([data1, data2]));
        });
    });
});

app.post('/lookingForAPlayer', function(req, res) {
    //Here I will also res.end() as I do in /startGame.
});

标签: javascriptnode.js

解决方案


处理@Yousaf 的帖子,使用async/await可能更容易在心理上形象化。

try {
  const res = await fetch('/startGame', {
    method: 'POST',
    body: JSON.stringify({ username: username }),
    headers: { 'Content-Type': 'application/json' },
  });

  await fetch('/lookingForAPlayer', {
    method: 'POST',
    body: JSON.stringify({}),
    headers: { 'Content-Type': 'application/json' },
  });
} catch (error) {
  console.log(error);
}

推荐阅读