微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

js函数参数通过魔术传递

如何解决js函数参数通过魔术传递

我发现了一个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的神奇之处,因为我对此一无所知。

很抱歉,如果主题重复,但我不知道如何搜索

感谢您的帮助。

解决方法

函数是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`);
    });
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。