使用node js在一个arrayobject中实现多个API结果。

问题描述 投票:0回答:1

我想在每一行的google sheet上调用一个API.API将返回JSON对象,我想在所有行完成后推入数组。我想把这个数组做进一步处理。

for e.g resultArr = [{第一条Api结果}, {第二条Api结果}......以此类推。]

下面是我的代码,我有一个尝试。

const axios = require("axios");
const assert = require("assert");
const path = require("path");
const fs = require("fs");
const { GoogleSpreadsheet } = require("google-spreadsheet");

const doc = new GoogleSpreadsheet("ABCDEFGHIJKLMOPQRSTUVWxyz");
doc.useApiKey("ABCDEFGHIJKLMOPQRSTUVWxyz");

let jsonRowArr = ["initial"];

async function test1() {
    await doc.loadInfo();

    const sheet = doc.sheetsByIndex[0]; /* or use doc.sheetsById[id] */

    /* read all rows */
    const rows = await sheet.getRows(); // can pass in { limit, offset }

    rows.forEach(async (row, index) => {
        let heading = row["_sheet"]["headerValues"];
        fieldValue = {};
        let rowValue = row["_rawData"];
        heading.forEach((key, i) => {
            fieldValue[key] = rowValue[i];
        });

        //start here
        let APIParam = {
            test_name: `test ${index}`,
            shipping_method: {
                before_decimal_point: fieldValue["Before Decimal"],
                after_decimal_point: fieldValue["After Decimal"],
                closest_round: "100",
            },
            shipping_price: fieldValue["3 Digit"],
            method_name: "get_shipping_after_round",
            expected_rate_up: ["Expected Down 3"],
            expected_rate_down: ["Expected Up"],
        };

        APIAfterApiData = await apiCallNewFn(APIParam);

        await jsonRowArr.push("dsv");
        await jsonRowArr.push(APIAfterApiData);
    });
    return await jsonRowArr;
}
apiCallNewFn = async (params) => {
    let { data } = await axios.post(
        "http://api.example.com/call_function.php",
        null,
        {
            params,
        }
    );
    // console.log('data...', data);
    data["test_name"] = await params.test_name;
    data["expected_rate_up"] = await params.expected_rate_up;
    data["expected_rate_down"] = await params.expected_rate_down;

    return await data;
};

(async () => {
    let customTestObj = await test1();
    console.log("I want fianl result here");
    console.log(customTestObj);
    console.log("for further process");
})();
node.js api asynchronous async-await es6-promise
1个回答
1
投票

这个修改怎么样?在这个修改中,我使用了 apiCallNewFn 返回 Promise。并使用for循环代替forEach。参考 当你的脚本被修改后,就变成了下面的样子。在这次修改中。test1()apiCallNewFn 已修改。

test1():

async function test1() {
  await doc.loadInfo();
  const sheet = doc.sheetsByIndex[0];
  const rows = await sheet.getRows();
  for (let index = 0; index < rows.length; index++) {
    const row = rows[index];
    let heading = row["_sheet"]["headerValues"];
    fieldValue = {};
    let rowValue = row["_rawData"];
    heading.forEach((key, i) => {
      fieldValue[key] = rowValue[i];
    });
    let APIParam = {
      test_name: `test ${index}`,
      shipping_method: {
        before_decimal_point: fieldValue["Before Decimal"],
        after_decimal_point: fieldValue["After Decimal"],
        closest_round: "100",
      },
      shipping_price: fieldValue["3 Digit"],
      method_name: "get_shipping_after_round",
      expected_rate_up: ["Expected Down 3"],
      expected_rate_down: ["Expected Up"],
    };
    APIAfterApiData = await apiCallNewFn(APIParam);
    jsonRowArr.push("dsv");
    jsonRowArr.push(APIAfterApiData);
  }
  return jsonRowArr;
}

apiCallNewFn():

const apiCallNewFn = async (params) => {
  return axios
    .post(
      "http://api.example.com/call_function.php",
      null,
      {
        params,
      }
    )
    .then((res) => {
      let data = { res: res.data };
      data["test_name"] = params.test_name;
      data["expected_rate_up"] = params.expected_rate_up;
      data["expected_rate_down"] = params.expected_rate_down;
      return data;
    });
};

const apiCallNewFn = async (params) => {
  return axios
    .post(
      "http://api.example.com/call_function.php",
      null,
      {
        params,
      }
    )
    .then((data) => {
      data["test_name"] = params.test_name;
      data["expected_rate_up"] = params.expected_rate_up;
      data["expected_rate_down"] = params.expected_rate_down;
      return data;
    });
};

注意事项

  • 关于 apiCallNewFn,请修改脚本以达到你所期望的结果。
© www.soinside.com 2019 - 2024. All rights reserved.