我如何在 For 循环中使用 Promises

How can i use Promises in For loop

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}`))
}

我正在尝试使用 for 循环使用 wiki js 从维基百科获取数据。但是for循环不要等待承诺结束我该如何解决这个问题

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


const promises = dates.map((date)=>{
   return wiki().page(date)
})

Promise.all(promises).then((data)=>{
})

您可以使用 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
})

正如您所说,您的循环在循环中同步执行您的承诺,而不是异步执行,这里发生的是您的回调将在循环中使用最后一个索引 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)
}