首页 > 解决方案 > 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 的非阻塞特性,代码进入了无限循环。

标签: javascriptarraysasynchronouswhile-loopfunctional-programming

解决方案


您可以包装 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()


推荐阅读