首页 > 解决方案 > Promises.all 在循环多个 ajax 请求后未触发

问题描述

我正在导入一个 json 文件并循环遍历该对象。每个对象都有一个带有 eventID 的数组,我也循环遍历该数组。在这个 forEach 中,我将一个返回 Promise 的包装函数推送到数组中promises

遍历所有对象后,我promise.all()promises数组执行 a 。但奇怪的是,我在这个循环之后所做的任何事情都没有执行。

const fs = require('fs')
const promisify = require('util').promisify
const rp = require('request-promise')
const readFile = promisify(fs.readFile)
const filePath = 'json/results.json'

let promises = []

function init() {
  readFile(filePath, 'utf8')
  .then(file => {
    const json = JSON.parse(file)

    for (const country of json) {
      if (country.eventIDs.length === 0) return

      country.eventIDs.forEach(id => promises.push(getEventData(country, id)))
    }

// nothing here is executed,  
    console.log('this is not fired')

    Promise.all(promises)
           .then(results => writeFile(results))
           .catch( err => console.log(err))
  })
  .catch(err => console.log(err))
}

getEventData = (country, id) => new Promise((resolve, reject) => {

  setTimeout(() => {
    rp(url)
    .then((results) => {      
      resolve ({
        ...results
      })
    })
    .catch((err) => reject(`getEventData Error:\n ${err}`))
  }, 2000)
})

writeFile = (results) => {
  const json = JSON.stringify(results)
  // const date = new Date()
  // const filename = `${date.getTime()}-all-event-ids.json`
  const filename = `results-allevents.json`
  fs.writeFile(`json/${filename}`, json, 'utf8', () => console.log(`Succesfully written: ${filename}`))
}

init()

标签: javascriptasynchronouses6-promise

解决方案


调查后,线路:

if (country.eventIDs.length === 0) return

是主要问题(许多其他问题通过评论解决)。

解释这一点的问题是,return它没有跳过循环项目(可能是预期的),而是voidthen回调中返回,因此跳过了该块的进一步执行。

如果该条件为真,为了“跳过”该项目,只需执行此操作

    for (const country of json) {
      if (country.eventIDs.length > 0) { 
          country.eventIDs.forEach(id => promises.push(getEventData(country, id))) 
      }
    }

推荐阅读