Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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

我正试图通过wikijs使用for循环从Wikipedia获取数据。但是for循环没有等待promise end如何解决这个问题呢

请尝试映射而不是for循环,并将其分配给promises变量,然后执行promise.all(promises)来解决所有承诺

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