链接多个.然后,一些没有异步代码的函数.最佳实践
Chaining multiple .then, some functions without asynchronous code. Best practise?
我有一个异步运行的函数,比如查询数据库中的记录。剩下的代码取决于结果,但会同步运行。我很难理解处理这个问题的好方法,想知道最好的做法是什么?
想象一下以下代码:
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);
- 如果在'/'执行此函数的途径是可以异步执行此代码
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 如何从一系列级联异步代码中返回值
- 要按顺序执行的异步代码
- 谷歌分析-升级到异步代码
- 基准测试引发错误的异步与同步代码
- 如何在node.js和MongoDb中混合javascript中的同步和异步代码
- 使用异步代码引发/捕获错误的替代方法
- 使我的异步代码与setTimeout同步.我需要承诺吗
- Node.js:异步代码 + js 闭包的问题
- Meteor - 在客户端上的异步回调的 for 循环后运行代码
- JavaScript代码的异步执行
- 用外行的术语理解异步代码
- 异步.js中第 169 行和第 171 行之间的代码块是什么意思
- 我怎样才能异步执行 JavaScript 代码片段并等待它们的结果
- 在应用程序框架中处理异步 Javascript 代码的最佳实践
- 如何在不出现异步错误的情况下加载 Gist 代码
- 解析云代码:如何调用异步保存的承诺
- 以编程方式将同步代码转换为异步代码
- 如果“beforeEach”中的代码是异步的,如何在 Jasmine 中测试方法