You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用setTimeout延迟调用亚马逊API报fn.apply is not a function如何解决

报错原因

你在调用fetchPriceAfterDelay工具函数时,第一个参数传入的是getProductPrice(item.productData.ASIN, item.productData.marketPlace)的执行结果,该结果是Promise对象而非可执行的函数。工具函数内部需要调用传入的fn参数,非函数类型自然无法执行,因此抛出fn.apply is not a function错误。
同时你封装的工具函数还存在参数传递的缺陷:setTimeout回调中接收的...args没有对应传入源,即使你传了正确的函数,也无法拿到执行所需的参数。

修复方案

方案1:仅修改调用代码(无需改动工具函数)

调用时传入匿名函数包裹getProductPrice的执行逻辑,保证传给工具函数的第一个参数是可执行函数:

amazonProductPriceChange = await fetchPriceAfterDelay(
  () => getProductPrice(
    item.productData.ASIN,
    item.productData.marketPlace
  ),
  2000
);

方案2:优化工具函数,支持参数透传(更易用)

先改写延迟工具函数,新增参数透传逻辑:

export const fetchPriceAfterDelay = (fn, delay, ...args) => {
  return new Promise((resolve, reject) => {
    setTimeout(async () => {
      try {
        const importedData = await fn(...args);
        resolve(importedData);
      } catch (err) {
        reject(err);
      }
    }, delay);
  });
};

改写后调用时无需写匿名包裹函数,直接传入目标函数、延迟时长、目标函数所需参数即可:

amazonProductPriceChange = await fetchPriceAfterDelay(
  getProductPrice,
  2000,
  item.productData.ASIN,
  item.productData.marketPlace
);

内容的提问来源于stack exchange,提问作者Deviker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:36:01