【问题标题】:How can i use Promises in For loop我如何在 For 循环中使用 Promises
【发布时间】:2021-02-07 11:47:51
【问题描述】:
const wiki = require('wikijs').default;
const { writeFileSync } = require("fs")
const dates = require("./getDates")
//December_23
for (let i = 0; i < dates.length; i++){
        wiki()
            .page(dates[i])
            .then(page => page.content()).then((value => {
                writeFileSync(`./data/${dates[i]}.json`,value)
                console.log(`${dates[i]} imported`)
        }
        )
        ).catch((err) => console.error(`${dates[i]} error\n${err}`))
}

我正在尝试通过 wikijs 使用 for 循环从 Wikipedia 获取数据。但是for循环没有等待承诺结束我该如何解决这个问题

【问题讨论】:

  • 这能回答你的问题吗? Wait promise inside for loop
  • 您能否更具体地说明为什么它不等待承诺这一事实对您来说是个问题?是不是因为当承诺结束时,i 最终变成了dates.length - 1

标签: javascript node.js es6-promise


【解决方案1】:

正如你所说,你的循环在循环中同步而不是异步执行你的承诺,这里发生的是你的回调将在循环中使用最后一个索引 i 调用,因为你的循环将完成工作并且稍后将调用您的回调

您可以通过创建一个闭包来为每个回调保存索引来解决此问题:

一种解决方案是使用 forEach,因为它会创建自己的 closure

dates.forEach((date, i) => {
   wiki.page(date).then(..........)
})

另一种解决方案是在循环中创建一个 IIFE

for(let i = 0; i < dates.length; i++  ) {
  (function(i){
    //Your logic
  })(i)
}

【讨论】:

  • 我相信这是正确的答案。 OP 不清楚 为什么 问题在于循环没有等待承诺,但可能就是这样。
【解决方案2】:

您可以使用Promise.all

const wiki = require('wikijs').default;
const { writeFileSync } = require("fs")
const dates = require("./getDates")
//December_23

const promises = []
for (let i = 0; i < dates.length; i++) {
  promises.push(
    wiki()
    .page(dates[i])
    .then(page => page.content())
    .then(value => {
      writeFileSync(`./data/${dates[i]}.json`,value)
      console.log(`${dates[i]} imported`)
    })
  )
}

Promise.all(promises)
.then(res => {
  // do something
})

【讨论】:

    【解决方案3】:

    尝试使用 map 而不是 for 循环并将其分配给 promises 变量并执行 Promise.all(promises) 以解决所有 promises

    
    const promises = dates.map((date)=>{
       return wiki().page(date)
    })
    
    Promise.all(promises).then((data)=>{
    })
    
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多