我有一个异步运行的函数,例如从数据库查询记录。其余代码取决于结果,但同步运行。我正在努力理解处理这个问题的好方法,并希望了解最佳做法?
想象一下以下代码:
var usersDataPromise = getUsersDataFromDB();
var usersAgeArray = usersDataPromise.then(extractAges);
var averageAge = calculateAverageAge(usersAgeArray);
这里,getUsersDataFromDB()同步运行并返回一个promise。当promise解析时,它运行extractAges(),这个函数只需要获取一些数据并返回一个数组。此功能是同步的。我想将它传递给calculateAverageAge(),但这是它破坏的地方:calculateAverageAge不等待getUsersFromDB()完成,并且只是尽快启动(usersAgeArray将是未定义的)。
我尝试了什么:
我可以使extractAges()返回一个promise而不是一个数组,并使calculateAverageAge等待.then,通过执行:
var usersDataPromise = getUsersDataFromDB();
var usersAgeArrayPromise = usersDataPromise.then(extractAges);
var averageAge = usersAgeArrayPromise.then(calculateAverageAge);
然而,感觉好像我使代码变得不必要地复杂:我使extractAges()返回一个promise,即使它是异步运行,而不是同步。
我意识到我可以在extractAges函数的末尾调用calculateAverageAge(),但是我试图学习如何保持代码清洁,这感觉好像我引入了副作用一个只应该提取数组的函数。现在功能描述看起来并不完全准确:它提取一个数组,但也调用下一个函数。
我希望我已经明白这一点,我无法绕过它。处理这个问题的最佳方法是什么?谢谢!
答案 0 :(得分:0)
我可以让
extractAges()
返回一个promise而不是一个数组
没有理由这样做。只是因为你在then
回调中使用了一个函数,它不需要返回promises。
并使
calculateAverageAge
等待.then
是的,你需要无论如何都要使用then
,因为数组是异步生成的,usersDataPromise.then(extractAges)
总是返回一个promise。别无选择。
var averageAgePromise = getUsersDataFromDB().then(extractAges).then(calculateAverageAge);