【问题标题】:js function parameters pass by magicjs函数参数魔术传递
【发布时间】:2020-08-26 04:50:04
【问题描述】:

我找到了一个 javascript 代码(我更新了),但有一部分代码我没有得到:/ (完整源代码:https://github.com/a-h/ddbimport/tree/working/01-nodeimport

我不明白的部分代码:

const batchOf = (size = 25, execute) => {
  const items = [];
  return async (item, last = false) => {
    if (item) {
      items.push(item);
    }
    if (last || items.length === size) {
      await execute(items);
      items.length = 0;
    }
  };
};

首先,我不明白最后一项怎么可能是真的?我在我的 CSV 中尝试了 5 行,但它从来没有执行部分......

其次,javascript从哪里获取item本身的值?我的意思是我们通常需要声明item 或将其传递给函数的参数。因为如果当我尝试拆分异步函数本身时,我需要将参数 item 传递给我的函数。

例如:

const batchOf = (size = 25, execute) => {
    const items = [];
    async function passItem (item, last = false) {
        if (item) {
            items.push(item);
        }
        if (last || items.length === size) {
            await execute(items);
            items.length = 0;
        }
    };
    return passItem(?, ? );  // i should pass some parameters here.. 
};

因此,如果有人可以帮助我解决 last 项目的问题,并向我解释 javascript 的魔力,因为我有点迷失了这个。

对不起,如果有重复的主题,但我不知道如何搜索。

感谢您的帮助。

【问题讨论】:

  • 看看返回值:return async (item, last = false) => {...}batchOf 存储一个函数,然后在第 92 行调用:const processor = batchOf(25, async (items) => {...})

标签: javascript function logic


【解决方案1】:

函数是 javascript 中的一等公民,这意味着它们可以像常规变量一样被存储、作为参数传递或从函数返回。以下是来自 mozilla 的详细概述:https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function

为了直接回答您的问题,'batchOf' 函数不会执行 return 语句中的异步函数。当开发人员执行 batchOf 函数时,他们会取回该内部函数,稍后将调用该函数。在这种情况下,他们创建了一个处理器:

const processor = batchOf(25, async (items) => {
    const dynamoItems = toDynamoItems(converters, items);
    await batchWrite({ client, table, dynamoItems });
    count += items.length;
    if (count % 2500 == 0) {
      const seconds = since(start);
      const itemsPerSecond = count / seconds;
      console.log(
        `Inserted ${count} records in ${seconds}s - ${itemsPerSecond} records per second`
      );
    }
  });

他们将关于他们希望第二个 if 语句做什么的详细信息传递给 batchOf 函数,然后返回一个新函数,他们在读取文件时调用该函数:

let rowIndex = 0;
  const parser = fastCsv
    .parseFile(fileName, { headers: true, delimiter })
    .on("error", (error) => console.error(error))
    .on("data", async (row) => {
      parser.pause();
      try {
        await processor(row);
        rowIndex++;
      } catch (err) {
        console.log(`Error processing row ${rowIndex}: ${err}`);
      } finally {
        parser.resume();
      }
    })
    .on("end", async (rowCount) => {
      await batch(null, true);
      console.log(`Parsed ${rowCount} rows`);
    });
};

【讨论】:

  • 哦,谢谢。我想我明白了你的意思,但是方法await batch(null, true) 从来没有被定义对吗?那么如何才能获得最后一项呢?因为当我在本地尝试时,他基本上告诉我 batch 未定义:/
  • 你说得对,我也没有看到“批次”的定义。这可能是一个错字,他们的意思是调用“处理器”。它是 git repo 的工作分支,而不是它们的主发布分支,因此代码库中存在出错的风险。
  • 首先感谢您的帮助和解释。我仍然对.on("end" 部分有疑问。现在它发送await processor(null, true)。但是第一个参数不能是null。例如:如果我有 30 个项目,那么将处理 25 个项目,然后剩下 5 个项目,我应该去on("end" 部分。那么我怎样才能得到尚未处理的剩余物品呢?我试图将const items = [] 放入范围之外,但在我的解决方案中,我得到了完整的数组(30 项)。我有点困惑..
猜你喜欢
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 2014-08-16
  • 1970-01-01
  • 2013-01-02
  • 2013-08-08
相关资源
最近更新 更多