Javascript 最后,在等待try块中的承诺解析之前调用块
我的代码如下所示:Javascript 最后,在等待try块中的承诺解析之前调用块,javascript,promise,Javascript,Promise,我的代码如下所示: (异步()=>{ 试一试{ const results=等待重计算(); 保存结果文件(结果); }捕获(e){ handleError(e); }最后{ 进程退出(0); } })(); const saveResultsToFiles=(结果)=>{ results.forEach(result=>{ (async()=>await saveResultFile(result)); }) } const saveResultFile=(结果)=>{ 返回承诺重新处理(结果
(异步()=>{
试一试{
const results=等待重计算();
保存结果文件(结果);
}捕获(e){
handleError(e);
}最后{
进程退出(0);
}
})();
const saveResultsToFiles=(结果)=>{
results.forEach(result=>{
(async()=>await saveResultFile(result));
})
}
const saveResultFile=(结果)=>{
返回承诺重新处理(结果)
.then(processedResult=>saveToFile(processedResult))
}
const promiseToPreprocess=异步(结果)=>{
//此函数返回预处理数据的承诺
}
常量保存文件=(数据)=>{
//此函数用于将数据同步保存到文件中
}
我以为这个代码会
第一步是可行的,因为程序似乎在等待繁重的计算结果。但是,似乎finally子句是在forEach循环中的承诺得到解决之前输入的,这导致程序提前退出。我做错了什么?这里有两个问题:
saveResultsToFiles
中的forEach
循环不会返回任何内容,因此您无法让代码的其他部分“等待”每个项目的承诺得到解决saveResultFile
返回一个承诺,但此承诺未在try
块中wait
edtry
块仅“启动”保存到文件的过程,而不是等到它完成后才转到finally
块
以下是您可以尝试的解决方案
等待每个saveResultFile
调用,为此,您需要访问saveResultsToFiles
中实例化的承诺数组。使用.map
您将实际获得一系列结果(与.forEach
相反):
saveResultsToFiles
实际上返回了一个承诺数组,那么您应该在继续之前等待所有承诺。这正是承诺的内容。所有的都是为了:
您没有等待
saveResultsToFiles(结果)代码>
尝试:
.forEach()
对async
函数一无所知。函数返回承诺,但.forEach()
始终忽略返回值。“SyntaxError:await仅在异步函数和异步生成器中有效”完美,我没有意识到是forEach函数导致了问题。作为对您的解决方案的一个小小调整,我使用了returnpromise.all(results.map(…
然后简单地等待saveResultsToFiles
,因为返回一个承诺比返回一个承诺数组更符合逻辑。因此它似乎不完全起作用。最后一个块仍然在之前调用。然后saveResultFile
的函数意味着该文件没有实际保存。我如何强制执行在转到finally块之前,等待的承诺以及then子句?对于要调用的.then
,我需要将中的函数映射到异步结果=>等待saveResultFile(结果)
,虽然我不明白为什么。@ToivoSäwén你确定saveToFile
会返回一个承诺吗?啊,就是这样。它没有。
const saveResultsToFiles = (results) => {
return results.map(result => saveResultFile(result));
}
try {
const results = await heavyCalculation();
await Promise.all(saveResultsToFiles(results));
}
(async () => {
try {
const results = await heavyCalculation();
saveResultsToFiles(results);
} catch (e) {
handleError(e);
} finally {
process.exit(0);
}
})();
const saveResultsToFiles = async (results) => {
results.forEach(result => {
await saveResultFile(result);
})
}
const saveResultFile = (result) => {
return promiseToPreprocess(result)
.then(processedResult => saveToFile(processedResult))
}
const promiseToPreprocess = async (result) => {
// this function returns a promise to preprocess the data
}
const saveToFile = (data) => {
// this function synchronously saves data to a file
}