【问题标题】:Multiple awaits in an async function does not return [duplicate]异步函数中的多个等待不返回 [重复]
【发布时间】:2020-12-25 21:12:30
【问题描述】:

我在服务器上有以下代码:

let tmpFileName;

// GET
app.get('/clicked', async (req, res) => {
    let nullOutput = writeTmpFile("hello, world!");
    await deleteTmpFile();
    console.log("Hurray, finished!");
    res.send({result:nullOutput});
})

function writeTmpFile(content){
    tmpFileName = "tmp" + Math.random().toString() + "tsl";
    return new Promise(resolve => {
        fs.writeFile(tmpFileName, content, function (err) {
            if (err) throw err;
            console.log('Temp file creation successful.');
        });
    })
}

function deleteTmpFile(spec){
    return new Promise(resolve => {
        fs.unlink(tmpFileName, function (err) {
            if (err) throw err;
            console.log('Temp file deletion successful.');
        });
    })
}

但是,在我的控制台输出中,我只得到

Temp file creation successful.
Temp file deletion successful.

但是,如果我删除await deleteTempFile(),那么Hurray, finished! 会出现在控制台上。

更一般地说,我如何调试这些问题模式? 为什么会这样?

【问题讨论】:

  • 你永远不会resolve你的承诺。

标签: javascript node.js promise async-await


【解决方案1】:

我已经重写了你的代码,以展示如何使用 Promise。

Promise 回调有两个函数作为参数:resolve 和 reject。

操作成功时调用resolve,失败时reject。

// I moved `tmpFileName` variable from here into the request handler,
// because it was "global" and would be shared between requests.

app.get('/clicked', async (req, res) => {
  let tmpFileName = "tmp" + Math.random().toString() + "tsl"
  let writingResult = await writeTmpFile(tmpFileName, "hello, world!")
  let deletionResult = await deleteTmpFile(tmpFileName)
  res.send({ writingResult, deletionResult })
  console.log("Hurray, finished!")
})

function writeTmpFile (filename, content) {
  return new Promise((resolve, reject) => {
    fs.writeFile(filename, content, function (err) {
      // on error reject promise with value of your choice
      if (err) reject(err)
      // on success resolve promise with value of your choice
      resolve('Temp file creation successful.')
    })
  })
}

function deleteTmpFile (filename) {
  return new Promise((resolve, reject) => {
    fs.unlink(filename, function (err) {
      if (err) reject(err)
      resolve('Temp file deletion successful.')
    })
  })
}

【讨论】:

    【解决方案2】:
    1. 要使用该文件,您可以使用writeFileSync 而不是writeFile。 (Reference)。

    2. 对于多个Promise,您可以使用Promise.all 方法。

    const promise1 = Promise.resolve(3);
    const promise2 = 42;
    const promise3 = new Promise((resolve, reject) => {
      setTimeout(resolve, 100, 'foo');
    });
    
    Promise.all([promise1, promise2, promise3]).then((values) => {
      console.log(values);
    });

    来自MDN

    【讨论】:

    • 对在请求处理程序中运行的代码使用 writeFileSync 将阻塞事件循环,直到写入完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2011-03-04
    • 2021-05-25
    • 2020-12-23
    • 2019-02-06
    • 2020-03-13
    相关资源
    最近更新 更多