首页 > 解决方案 > 使用循环插入数据不能保证顺序结果?

问题描述

如何以索引为标题将数据插入数据库?我认为这是典型的异步问题,但我无法解决。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)
  }
})()

标签: javascriptnode.jsecmascript-6

解决方案


你也可以使用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进行实际调用和随机有效负载以确保执行顺序始终相同。


推荐阅读