javascript - 使用循环插入数据不能保证顺序结果?
问题描述
如何以索引为标题将数据插入数据库?我认为这是典型的异步问题,但我无法解决。i 的插入顺序不是按顺序插入的。
const { times } = require('lodash')
module.exports = (async () => {
try {
const createJob = async (i) => {
console.log(i) //executed first 1 - 50 first
const { data } = await axios
.post('http://localhost:3000/job/create', {
"title": i,
"created_at": Date.now()
})
if(data) {
console.log('job created. ', data)
}
}
times(50, (i) => {
createJob(++i)
});
} catch(e) {
console.log('Error creating ad. ', e)
}
})()
解决方案
你也可以使用Promise.all
来解决这个问题。本质上,您将请求的所有承诺保存在一个数组中。一旦所有请求都完成,您就可以对其进行迭代。
const axios = require('axios');
module.exports = (async () => {
try {
const createJob = async (i, url) => {
console.log(i, url) //executed first 1 - 50 first
return axios.get(url);
}
const a = ['http://httpbin.org/anything/123', 'http://httpbin.org/anything/456']
const promiseArray = [];
for (let j = 0; j < 4; j++) {
promiseArray.push(createJob(j, a[j % 2]));
}
Promise.all(promiseArray).then((result) => {
console.log('result', typeof (result));
for (let i = 0; i < result.length; i++) {
console.log(result[i].data.url);
}
});
} catch (e) {
console.log('Error creating ad. ', e)
}
})()
我用于httpbin
进行实际调用和随机有效负载以确保执行顺序始终相同。
推荐阅读
- python - 找到数字 60085147514 的最大素因数(项目 euler #3)
- c# - 如何离线使用 Google Play 游戏保存的游戏(快照)?
- java - 如何对列表中具有重复名称的对象的属性进行平均?
- javascript - 在使用 HTML 和 JavaScript 代码在 Leaflet 中添加新标记之前删除以前的标记
- visual-studio - 项目的文件在哪里配置?
- c++ - 参数数量不定的函数
- reactjs - 如何在打印页面reactjs网页时从顶部删除文本“React App”和日期?
- node.js - Discord.js - Cannot edit a message
- php - 如何为特殊字符编写正则表达式
- loops - 如何在 Flutter 中使用 ListView.builder 和 for 进行循环