axios post 请求顺序不运行

Axios post request not running in sequence

我正在尝试正确使用异步系列,但无法确定我需要如何将数据发送到其中才能使其以与现在完全相同的方式处理每个 post 请求正在获取数据。

我有一个 excel 文件,我在其中获得多个状态以针对第一列中存在的每个 ID 进行标记。还有一些状态需要删除,删除部分并不难,我可以在不使用异步系列的情况下做到这一点,但是对于 posting 新记录,我需要使用异步系列。要post编辑的记录在'Mark Status 1'、'Mark Status 1 Date'、'Mark Status 2'等列下。所以我写了一个脚本来使用 for 循环获取记录并将它们发送给一个函数,该函数负责为 asyn 系列建模数据。在 markStatusCall 函数中,如果我放置一个 forEach 循环并且 运行 调用状态序列就会出错。应该是'Marks Status 1 value'、'Mark Status 2 value'等等。

我在这里附上我的代码,请看下面并查看 excel 文件 here

const Excel = require("exceljs");
const axios = require("axios").default;
const https = require("https");
const _async = require("async");

const instance = axios.create({
  httpsAgent: new https.Agent({
    rejectUnauthorized: false,
  }),
});
const returnedId = "5dd7fa20dcfa9600152cc2de";
const deliveredId = "5dd7fa20dcfa9600152cc2d3";
const returnedByVendorId = "5de7c418362e13001212f238";
const returnedToVendor = "5eb2ebfe02987816aad14269";
const atSwyftWarehouse = "5dd7fa20dcfa9600152cc2d8";
const reAttempted = "5e6ea5d87aa7bb6d726b2bbc";
const requestToReattempt = "5ee134230138634c27a6e1da";
const dispatched = "5dd7fa20dcfa9600152cc2e2";
const parcelAssignedDelivery = "5dd7fa20dcfa9600152cc2e3";
const cancelledByVendor = "5de7c418362e13001212f238";
var workbook = new Excel.Workbook();
workbook.xlsx.readFile("./1.xlsx").then(async function () {
  // use workbook

  var worksheet = workbook.getWorksheet("Interim");

  const parcelIds = [];
  const status = [];
  const date = [];
  var data = [];
  var finalData = [];

  for (let i = 2; i <= 10; i++) {
    worksheet.getRow(i).eachCell((cell, index) => {
      if (cell.value !== "") {
        worksheet.getColumn(index).eachCell((colCell, indexing) => {
          if (indexing === 1) {
            if (colCell.value === "Delete Status 1") {
              deleteData(i, cell);
            } else if (colCell.value === "Delete Status 2") {
              deleteData(i, cell);
            } else if (colCell.value === "Delete Status 3") {
              deleteData(i, cell);
            } else if (colCell.value === "Delete Status 4") {
              deleteData(i, cell);
            } else if (colCell.value === "Delete Status 5") {
              deleteData(i, cell);
            } else if (colCell.value === "Mark Status 1") {
              markData(i, index, cell);
            } else if (colCell.value === "Mark Status 2") {
              markData(i, index, cell);
            } else if (colCell.value === "Mark Status 3") {
              markData(i, index, cell);
            } else if (colCell.value === "Mark Status 4") {
              markData(i, index, cell);
            } else if (colCell.value === "Mark Status 5") {
              markData(i, index, cell);
            }
          }
        });
      }
    });
  }
  function markData(i, index, cell) {
    let row = worksheet.getRow(i);
    let date = row.getCell(index + 1).value;
    let parcelId = row.getCell(1).value;
    if (cell.value !== "" && date !== "") {
      let statusId =
        cell.value === "At Swyft Warehouse"
          ? atSwyftWarehouse
          : cell.value === "Dispatched"
          ? dispatched
          : cell.value === "Reattempted"
          ? reAttempted
          : cell.value === "Delivered"
          ? deliveredId
          : cell.value === "Cancelled"
          ? returnedId
          : cell.value === "Request for Reattempt"
          ? requestToReattempt
          : cell.value === "Parcel Assigned"
          ? parcelAssignedDelivery
          : cell.value === "Cancelled by Vendor"
          ? cancelledByVendor
          : deliveredId;
      console.log(parcelId, statusId, date);
      addStatus(parcelId, statusId, date);
    }
  }
  // Need help from here
  function addStatus(parcelId, statusId, date) {
    let values = {
      parcelId: parcelId,
      statusRepositoryId: statusId,
      createdAt: date,
      updatedByScript: true,
    };
    data.push(values);
  }

  finalData.push(() => markStatusCall(data));
  _async.series(finalData, (err, data) => {
    if (err) {
      console.log(err);
    }
  });

  async function markStatusCall(values) {
    console.log(values, "Came here");
    values.forEach((data) => {
       try {
      let response = await instance.post(
        "https://api.myDomain.com:3000/api/ParcelStatuses",
        {
          parcelId: data.parcelId,
          statusRepositoryId: data.statusRepositoryId,
          createdAt: data.createdAt,
          updatedByScript: data.updatedByScript,
        }
      );
      console.log("Updated");
    } catch (err) {
      console.log("here");
      console.error(err);
    }
    })
  }

尝试做这样的事情

  function markStatusCall(values) {
    let promises=[];
    values.forEach((data) => {
         const promise = instance.post(
        "https://api.myDomain.com:3000/api/ParcelStatuses",
        {
          parcelId: data.parcelId,
          statusRepositoryId: data.statusRepositoryId,
          createdAt: data.createdAt,
          updatedByScript: data.updatedByScript,
        });
      return promises.push(promise);
    })
  Promise.all(promises).then(() => { 
   console.log('success') 
   }).catch(error => { 
  console.error(error.message)
  });
 }

这仍然不能确保您的订单,但强烈建议使用 promises 而不是 async-await

仅当所有响应的延迟时间相同时,响应顺序才会按照您的顺序排列

像这样的东西行得通吗:

async function markStatusCall(values) {
  console.log(values, "markStatusCall begin");
  
  function loop(values, index) {
    console.log('loop at index', index);
    const data = {
      parcelId: data.parcelId,
      statusRepositoryId: data.statusRepositoryId,
      createdAt: data.createdAt,
      updatedByScript: data.updatedByScript};

    try {
      let response = await instance.post("https://api.myDomain.com:3000/api/ParcelStatuses", data);
      console.log("Updated");
      if (index <= (values.length -1)) {
        loop(index + 1);
      } else {
        return;
      }
    } catch (err) {
      console.log("Error");
      console.error(err);
    }
  }

  await loop(values, 0);
}

这个想法是循环等待每个 POST 请求,然后再移动到 values 数组中的下一个项目。 (上面的代码可能有一些错别字)。

See this example on codepen