Javascript 我如何在For循环中使用承诺 const wiki=require('wikijs')。默认值; const{writeFileSync}=require(“fs”) const dates=需要(“./getDates”) //十二月二十三日 for(设i=0;ipage.content())。然后((value=>{ writeFileSync(`./data/${dates[i]}.json`,值) console.log(`${dates[i]}imported`) } ) ).catch((err)=>console.error(`${dates[i]}error\n${err}`) }
我正试图通过wikijs使用for循环从Wikipedia获取数据。但是for循环没有等待promise end如何解决这个问题呢请尝试映射而不是for循环,并将其分配给promises变量,然后执行promise.all(promises)来解决所有承诺Javascript 我如何在For循环中使用承诺 const wiki=require('wikijs')。默认值; const{writeFileSync}=require(“fs”) const dates=需要(“./getDates”) //十二月二十三日 for(设i=0;ipage.content())。然后((value=>{ writeFileSync(`./data/${dates[i]}.json`,值) console.log(`${dates[i]}imported`) } ) ).catch((err)=>console.error(`${dates[i]}error\n${err}`) },javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我正试图通过wikijs使用for循环从Wikipedia获取数据。但是for循环没有等待promise end如何解决这个问题呢请尝试映射而不是for循环,并将其分配给promises变量,然后执行promise.all(promises)来解决所有承诺 const wiki = require('wikijs').default; const { writeFileSync } = require("fs") const dates = require("./g
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}`))
}
您可以使用
Promise.all
const promises = dates.map((date)=>{
return wiki().page(date)
})
Promise.all(promises).then((data)=>{
})
const wiki=require('wikijs')。默认值;
const{writeFileSync}=require(“fs”)
const dates=需要(“./getDates”)
//十二月二十三日
常量承诺=[]
for(设i=0;ipage.content())
.然后(值=>{
writeFileSync(`./data/${dates[i]}.json`,值)
console.log(`${dates[i]}imported`)
})
)
}
所有(承诺)
。然后(res=>{
//做点什么
})
正如您所说,您的循环在循环中同步而非异步地执行您的承诺,这里发生的是,您的回调将使用循环中的最后一个索引i调用,因为您的循环将完成工作,稍后将调用您的回调
您可以通过创建闭包来解决此问题,以保存每个回调的索引:
一种解决方案是在创建自己的闭包时使用forEach:
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
})
另一个解决方案是在循环中创建一个IIFE:
dates.forEach((date, i) => {
wiki.page(date).then(..........)
})
for(设i=0;i
这是否回答了您的问题?你能说得更具体一点吗?为什么不等待承诺对你来说是个问题?是不是因为当承诺结束时,所有的承诺都变成了日期。长度-1?我相信这是正确的答案。OP不清楚为什么循环没有等待承诺是个问题,但这可能就是问题所在。
for(let i = 0; i < dates.length; i++ ) {
(function(i){
//Your logic
})(i)
}