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

在.post函数node.js中相继调用两个异步函数

闾丘朗
2023-03-14

我想从客户端接收一个图像,将其转换为文本,然后删除图像,一旦它被转换。我正在使用以下代码:

app.post('/upload', (req,res)=>{
    const myFile = req.files.file;
    myFile.mv(`D:/web_projects/react-express-mongodb-template/server/pictures/${myFile.name}`)
    
    let img = `D:/web_projects/react-express-mongodb-template/server/pictures/${myFile.name}`
    convert(img);
    remove(img)
    
})
app.listen(5000, () => {
    console.log('server is running at port 5000');
})
async function convert(img){
  const worker = createWorker();
    
  console.log(worker)
  await worker.load();
  await worker.loadLanguage('eng');
  await worker.initialize('eng');
  const { data: { text } } = await worker.recognize(img);
  console.log(text);
  await worker.terminate();
    
}
async function remove(path){
  try {
    fs.unlink(path)
  } catch(err) {
    console.error(err)
  }
}

因此,在post方法中,我调用convert函数,然后调用remove,但remove首先执行,因此convert函数导致错误。有办法处理这个问题吗?

共有1个答案

宣弘新
2023-03-14

由于convertasync函数,因此返回承诺,因此替换:

convert(img);
remove(img)

与:

convert(img).then(() => remove(img));

但是,这假设convert中所有等待的worker方法调用都返回承诺。如果情况并非如此,并且它们运行的是异步代码,那么convert实际上不会正确地等待这些代码,您应该首先对它们进行承诺。

 类似资料:
  • 问题内容: 假设您维护一个公开一个函数的库。您的用户调用它来获取实际数据: 数据被保存在文件中,因此您可以使用内置的Node.js来实现。很明显这两个和是同步的功能。有一天,您被告知将基础数据源切换到只能异步访问的仓库(例如MongoDB)。还被告知要避免惹恼您的用户,API不能更改为仅返回promise或要求回调参数。您如何满足这两个要求? 使用回调/承诺的异步功能是JavasSript和Nod

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 当导航到带有防护装置的页面时,已或都会打印到控制台(在等待 firebase 响应的一段时间后)。但是,导航永远不会完成。另外,如果我没有登录,我会被重定向到路由。因此,我遇到的问题是 不会向用户显示请求的页面。我假设这是因为我正在使用回调,但我无法弄清楚如何做到这一点。有什么想法吗?

  • 问题内容: 我有以下函数,可用于从我的代码中调用Lambda函数。 但是,当我尝试在Lambda函数中使用它时,出现以下错误: 如何从Lambda函数中调用Lambda函数? 我的功能: 问题答案: 使用每个Lambda中都提供的,从另一个Lambda函数中调用Lambda函数非常简单。 我建议首先从 简单的 事情开始。 这是lambda内调用的“ Hello World”: 使用包含一个参数的调