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
相关产品推荐
相关产品推荐

