javascript - javascript while循环使用函数式编程和异步
问题描述
我正在尝试找出一种使用函数式编程编写以下代码的方法。
let member_found = [];
// going through 50 or more pagination until 5 are found.
while(member_found.length < 5)
{
let member = findMember(/* calls selenium commands to visit next page */);
if(member != undefined)
member_found.push(member);
}
console.log(member_found) // expecting 5 values but actual is 0.
目前,由于 js 的非阻塞特性,代码进入了无限循环。
解决方案
您可以包装 findMember 以返回一个承诺,然后您可以使用 ES6 async\await 功能:)
假设你有findMember(cb)
,所以它会是
function promiseFindMember() {
return new Promise((res, rej) => findMember(member => res(member)))
}
通过这种方式,您将能够编写如下函数
function async foo() {
let members = []
while(member_found > 5) {
let member = await promiseFindMember()
if(member !== undefined) {
members.push(member)
}
}
}
我还添加了一个例子来捕捉这个概念并比较这些想法:)
function dummyCb(cb){
console.log("Dummy run!")
setTimeout(cb, 1000)
}
function promiseDummyCb(){
return new Promise((res, rej) => dummyCb(() => res()))
}
async function async_hello() {
cb_count = 0
while(cb_count < 5) {
await promiseDummyCb()
cb_count += 1
}
}
async function hello() {
cb_count = 0
while(cb_count < 5) {
dummyCb()
cb_count += 1
}
}
hello()
推荐阅读
- r - dplyr 选定行的行总和
- windows - Windows 批量压缩文件无效
- svg - 尝试使用 SVG 作为背景时模块解析失败
- postgresql - 实体学说之间的关系。如何引用“外键”?
- angular - Angular:如何订阅父组件中的子路径?
- javascript - 禁止 div 中的 javascript
- javascript - 我需要使用对象的属性对 Vue 中的对象数组进行排序,但 Vue 进入无限循环进行排序
- javascript - JQUERY TAGIT 验证输入是否为数字
- reactjs - 降级到 babel 6.2.3
- macos - 如何使用 mac os 解决我的 zsh 上的自动完成无法正常工作的问题