循环的Javascript异步行为

时间:2019-07-09 15:27:13

标签: javascript loops asynchronous

我当时使用async / await异步获取数据,然后又一次运行两个for循环。所以我的问题是,由于js是异步的,因此for循环对于大数据集是否会彼此重叠,如果是,该如何解决呢? 哪些条件循环可以重叠?

实际上,我正在尝试制作一个下拉列表及其功能,但我对此表示怀疑。

const createDropdown = async language => {
    let i = 0;
    let listPromise = new Promise((resolve, reject) => {
        db.ref("Products/" + language).on('value', snapshot => {
            resolve(snapshot.val())
        })//Fetching Data
    })

    let list = await listPromise;

    for(i in list)
        dropdown.remove(0)

    for(i in list)
        dropdown.options[dropdown.options.length] = new Option(list[i].name, list[i].name)
}

我正在运行此代码,并且for循环不会重叠,但是有条件吗?

2 个答案:

答案 0 :(得分:1)

一个循环接一个循环地放置的循环永远不会与循环内的代码同步或异步重叠。

for (var i = 0; i < 10; i++) {
    doSomethingSync()
}



for (var j = 0; j < 10; j++) {
    createPromise().then((res) => {console.log(res))
}


for (var k = 0; k < 10; k++) {
    var res = await createPromise();
    console.log(res);
}

上面,“ I”循环完成其所有操作,然后完成“ J”循环,然后完成“ K”循环。

这是每个操作的顺序和详细信息

  1. “ I”循环将10个同步操作序列化。
  2. “ J”循环创建10个不同的Promise。他们可能会以不同的顺序解决。
  3. “ K”循环创建10个序列化的Promise。每次迭代都会等到诺言得到解决,然后再寻求最终结果。

1、2和3总是一个接一个地发生。

答案 1 :(得分:0)

我使用此解决方案与axios一起使用,对服务器的请求约为1000个,并且运行良好,也许这也可以成为您的解决方案。在这段代码中,您将对db.ref作出承诺,并等待响应,然后使用该响应进行操作。

const createDropdown = async (language) => {
  const listPromise = await Promise.all(
    return await db.ref("Products/" + language).on ('value', snapshot => snapshot.val())
  )

  for(i in listPromise)
        dropdown.remove(0)

  for(i in listPromise)
        dropdown.options[dropdown.options.length] = new Option(list[i].name, list[i].name)
}