javascript - 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()
解决方案
调查后,线路:
if (country.eventIDs.length === 0) return
是主要问题(许多其他问题通过评论解决)。
解释这一点的问题是,return
它没有跳过循环项目(可能是预期的),而是void
在then
回调中返回,因此跳过了该块的进一步执行。
如果该条件为真,为了“跳过”该项目,只需执行此操作
for (const country of json) {
if (country.eventIDs.length > 0) {
country.eventIDs.forEach(id => promises.push(getEventData(country, id)))
}
}
推荐阅读
- ruby-on-rails - 获取无效请求:HTTP 元素 QUERY_STRING 长于 (1024 * 10) 允许的长度
- apache-spark-sql - 存在 Spark 数据框的性能问题
- python - 如何检查一个数据框中的值是否存在于另一个数据框中的键中
- java - 如何修复 outOfMemoryException?
- c++ - 派生类中不可用的赋值运算符
- javascript - 为什么发布 json 不能与 ajax 一起使用?我该怎么办
- nlp - 对文本数据使用特征工具(字数统计,tfidf)
- android - 如何使 Android Wear Watchface 可以从手机上安装?
- javascript - 如何使用javascript在单个变量中添加多个值?
- ruby-on-rails - 是否可以在需要登录才能查看的 Facebook 页面中捕获链接?