【发布时间】:2021-09-10 03:35:53
【问题描述】:
我正在用 NodeJS 和 Express 做一个爱好项目,但是处理异步调用让我不知所措。我遇到了一个我想在社区中反弹的错误。
我目前使用 Express 进行此布局,我将向其发送帖子请求。
快递(后端)
app.post("/", async (req, res) => {
const createDocument = (args1) => {
// declare some variables ...
// for loop ...
// (quite fast)
loadFile(args2, async () => {
// upload a file (quite slow)
await upload(file, filePath)
//send post request to third party (quite fast)
let res = await axios.post(url, data, {
headers: {
'X-Auth-Token': KEY
}
}).then(res => console.log('success')).catch(error => console.log('failure'))
})
}
const args1 = "someargs"
await new Promise(resolve => setTimeout(resolve, 2000))
await createDocument(args1)
res.end()
})
反应(前端)
const saveDocButtonClicked = useCallback(async (event) => {
// do some stuff ...
await axios.post('/', {
headers: {
'Content-Type': 'application/json'
},
jsonData
}).then(res => console.log('Data sent')).catch(err => console.log(err.data))
// do some other stuff ...
}
我希望 React 应用等待,在从 API 调用到 Express 后端得到正确响应之前不要继续。
我希望 Express 应用仅在完成所有任务后才能给出正确的响应。
到目前为止,这对于较小的文件效果很好,但随着文件大小的增加,它们不再被保存/存储在数据库中。
我注意到的关键区别在于,在这些糟糕的情况下,字符串 success 或 failure 应该来自 Express 后端的这段代码; .then(res => console.log('success')).catch(error => console.log('failure')) 不再被输出。所以在某个地方,异步事件可能会抢先一步。
我确信我犯了很多错误,请随时指出,我很想学习这个,我是异步调用的大一新生。
【问题讨论】:
-
我认为问题在于
createDocument,您应该从该函数返回承诺,只要loadFile完成,该函数就会解决。希望有帮助 -
好的,这在代码中会是什么样子?我有几个想法,但不能写在cmets小窗口里。
标签: javascript node.js api express asynchronous