【问题标题】:How can I store the value of an async function to be used multiple times in a function without having to make the async call multiple times?如何存储要在函数中多次使用的异步函数的值,而不必多次进行异步调用?
【发布时间】:2021-08-18 09:11:48
【问题描述】:

我有一个异步函数,可以像这样进行 API 调用:

const getModel = async () => {
  const model = await fetch model...
  return model;
};

我还有一个函数是使用tfjs模型来分析文本的情感:

export const analyzeSentiment = async (text) => {
  const model = await getModel();
  const score = await predict(text, model);
  return score;
};

我的问题是我将多组文本映射到analyzeSentiment 函数,这需要getModel 对每组文本进行提取调用。有没有办法设置getModel()的返回 到一个将持续存在的变量,允许它只被调用一次并在每次调用analyzeSentiment 时使用?我也尝试在函数内部声明analyzeSentimentawait 之外的模型,但这也不起作用。如果重要的话,我正在使用 React/Node。

【问题讨论】:

  • async 的任何函数都返回一个 Promise ...因此需要awaited 或使用.then ...
  • 顺便说一句......因为 getModel 基本上返回一个 Promise ,它是其中唯一(也是最后一个)等待函数的结果......它的功能与 const getModel = () => fetch model... 相同 - 你看到了, 你正在返回一个 Promise
  • 问题是您的analyzeSentiment()getModel() 耦合太紧。如果您需要在多次调用analyzeSentiment() 之间共享model 的参数,则将其设置为analyzeSentiment()。这基本上意味着当您映射多组文本时,您还不如直接使用predict()
  • "我也尝试过在 analyzeSentiment 之外声明模型并在函数中等待它" - 这应该可以完美运行(但您可能希望将变量重命名为 modelPromise )。请给我们看一下那次尝试的代码吗?
  • 抱歉回复晚了,但我最终使用了接受的答案的方法。我尝试的是声明'model = getModel()'并执行'analyzeSentiment = async(等待模型,文本)=> ...',但是由于我将数组映射到'analyzeSentiment','getModel'仍然被称为每个每次都需要作为参数的时间。

标签: javascript node.js reactjs async-await promise


【解决方案1】:

您可以创建一个本地缓存变量,该变量会记住第一次请求时的值,然后从那时起使用该值:

let cachedModel;

export const analyzeSentiment = async (text) => {
  if (!cachedModel) {
       cachedModel = getModel();
  }
  return predict(text, await cachedModel);
};

在此实现中,cachedModel 将包含第一次调用 analyzeSentiment() 时的承诺。如果按顺序多次调用analyzeSentiment(),代码仍然只会调用一次getModel()——所有后续调用都将等待同一个promise。无论承诺是未决还是已经实现,这一切都有效。


或者,如果您只想对一系列 analyzeSentiment() 调用使用相同的模型,但仅用于特定的一系列调用,则在调用者中获取模型一次并将相同的模型传递给 @ 的序列987654327@ 作为函数参数调用。

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2021-12-03
    • 1970-01-01
    • 2018-11-17
    • 2022-10-14
    • 2011-01-22
    相关资源
    最近更新 更多