我在我的Node代码中需要从数据库(MySQL)中检索4或5个项目,然后对结果进行一些数学计算,然后将结果返回到调用的代码的主要部分。功能。在我从这些函数或函数返回数据之前,我无法在代码中继续前进。
我读到的所有内容都说不会创建同步功能,因为你带走了使用Node的所有快乐和美丽。但是,我实际上无法继续执行我的代码而没有函数的结果。
那么,我不需要同步功能吗?如果是这样,为什么会这么错? LOL。
我想过做一个同步的大外部函数,它包含实际完成工作的4个或5个函数。我可以使嵌套函数Async并使外部函数(容器)同步。
对此有何想法? Node的新手,并且只是第一次尝试这样做。
答案 0 :(得分:1)
在继续之前等待几个i / o操作完成是一个常见问题,尤其是节点+数据库。我尽力做到这一点 async尽可能只在程序的逻辑流程绝对要求时阻塞。您对#34;使嵌套函数异步的想法"好像很好。
您可以利用Promise.all
启动所有异步内容。如果您等待承诺的结果,它将不会转到下一行代码,直到Promise.all
完成
这里有一些代码含有愚蠢但描述性的函数名称,我希望这些代码有用。
async function processIAmTryingToDoAsAsynchAsPossible(allCommandsToExecute) {
try {
// go get all the data asynchronously and destructure the results. But only move to the next line
// once all the async calls have returned
const [firstResult, secondResult, thirdResult] = await Promise.all(allCommandsToExecute.map(eachCommandToExecute => executeSqlFunction(eachCommandToExecute)));
// assuming it is just math, this is not an i/o operation so it will execute "synchronously"
const finalMathProduct = doMathOnThisStuff(firstResult, secondResult, thirdResult);
// assuming this is an i/o operation and the final function returns something you need
return await functionWeCallAfterGettingTheData(finalMathProduct);
} catch (err) {
// You'll get here if the Promise.all has a reject, if the final function errors out,
// or if you throw an error in one of the other functions.
throw err;
}
}