我如何在 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)
}
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)
}