链接多个.then,一些函数没有异步代码。最佳做法?

时间:2015-12-07 15:44:02

标签: javascript asynchronous promise

我有一个异步运行的函数,例如从数据库查询记录。其余代码取决于结果,但同步运行。我正在努力理解处理这个问题的好方法,并希望了解最佳做法?

想象一下以下代码:

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(),但是我试图学习如何保持代码清洁,这感觉好像我引入了副作用一个只应该提取数组的函数。现在功能描述看起来并不完全准确:它提取一个数组,但也调用下一个函数。

我希望我已经明白这一点,我无法绕过它。处理这个问题的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

  

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

没有理由这样做。只是因为你在then回调中使用了一个函数,它不需要返回promises。

  

并使calculateAverageAge等待.then

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

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