链接多个.然后,一些没有异步代码的函数.最佳实践

Chaining multiple .then, some functions without asynchronous code. Best practise?

本文关键字:代码 异步 函数 最佳 然后 链接      更新时间:2023-09-26

我有一个异步运行的函数,比如查询数据库中的记录。剩下的代码取决于结果,但会同步运行。我很难理解处理这个问题的好方法,想知道最好的做法是什么?

想象一下以下代码:

var usersDataPromise = getUsersDataFromDB();
var usersAgeArray = usersDataPromise.then(extractAges);
var averageAge = calculateAverageAge(usersAgeArray);

在这里,getUsersDataFromDB()同步运行并返回promise。当promise解析时,它会运行extractAges(),这是一个简单地获取部分数据并返回数组的函数。此功能为同步。我想把它传递给calculateAverageAge(),但它就是在这里中断的:calculateEverageAge不等待getUsersFromDB()完成,而是尽快启动(usersAgeArray将未定义)。

我尝试过的:

我可以让extractAges()返回一个promise而不是一个数组,并让calculateAverageAge等待。然后,通过执行:

var usersDataPromise = getUsersDataFromDB();
var usersAgeArrayPromise = usersDataPromise.then(extractAges);
var averageAge = usersAgeArrayPromise.then(calculateAverageAge);

然而,感觉好像我让代码变得不必要地复杂:我让extractAges()返回了一个promise,即使它是异步运行的,而不是同步运行的。

我意识到我本可以在extractAges函数的末尾调用calculateAverageAge(),但我正在努力学习如何保持代码的干净,这感觉就像我在给一个只应该提取数组的函数引入副作用。现在,函数描述似乎并不完全准确:它提取了一个数组,但也调用了下一个函数。

我希望我已经说清楚了,我很难理解。处理这个问题的最佳方法是什么?谢谢

我可以让extractAges()返回promise而不是数组

没有理由这么做。只是因为您在then回调中使用了一个函数,所以它不需要返回promise。

.then 使calculateAverageAge等待

是的,无论如何都需要使用then,因为数组是异步生成的,usersDataPromise.then(extractAges)总是返回promise。别无选择。

var averageAgePromise = getUsersDataFromDB().then(extractAges).then(calculateAverageAge);