【发布时间】:2022-01-04 14:19:38
【问题描述】:
我有一个从 amazon api 获取数据的函数。我想在几秒钟后调用它以避免来自亚马逊的太多请求错误。为此,我决定使用 setTimeout()。问题是,我需要从对亚马逊进行 api 调用的函数返回数据,我为此使用了 Promise。看起来正在调用对亚马逊进行 api 调用的函数,但随后我收到一条错误消息,fn.apply() is not a function
下面是我创建的实用函数。
export const fetchPriceAfterDelay = (fn, delay) => {
let promise = new Promise((resolve, reject) => {
setTimeout(async (...args) => {
let importedData;
try {
importedData = await fn(...args);
resolve(importedData);
} catch (err) {
reject(err);
}
}, delay);
});
return promise;
};
下面的函数负责对amazon进行api调用
export const getProductPrice = async (ASIN, marketPlace) => {
const requestParameters = {
ItemIds: [ASIN],
ItemIdType: 'ASIN',
Resources: ['Offers.Listings.Price'],
};
commonParameters.Marketplace = marketPlace;
try {
const productPrice = await amazonPaapi.GetItems(
commonParameters,
requestParameters
);
return productPrice;
} catch (err) {
throw new Api500Error(err);
}
};
下面是我如何调用实用函数。
amazonProductPriceChange = await fetchPriceAfterDelay(
getProductPrice(
item.productData.ASIN,
item.productData.marketPlace
),
2000
);
我收到以下错误。
TypeError: fn.apply is not a function
┃ at _callee$ (/Users/nabeel/Documents/ShopifyApps/amazon_importer/server/cron/cronUtils.js:6:32)
┃ at tryCatch (/Users/nabeel/Documents/ShopifyApps/amazon_importer/node_modules/@babel/polyfill/node_modules/regenerator-runtime/runtime.js:63:40)
┃ at Generator.invoke [as _invoke] (/Users/nabeel/Documents/ShopifyApps/amazon_importer/node_modules/@babel/polyfill/node_modules/regenerator-runtime/runtime.js:293:22)
┃ at Generator.next (/Users/nabeel/Documents/ShopifyApps/amazon_importer/node_modules/@babel/polyfill/node_modules/regenerator-runtime/runtime.js:118:21)
┃ at asyncGeneratorStep (/Users/nabeel/Documents/ShopifyApps/amazon_importer/server/cron/cronUtils.js:8:103)
┃ at _next (/Users/nabeel/Documents/ShopifyApps/amazon_importer/server/cron/cronUtils.js:10:194)
┃ at /Users/nabeel/Documents/ShopifyApps/amazon_importer/server/cron/cronUtils.js:10:364
┃ at new Promise (<anonymous>)
┃ at Timeout._onTimeout (/Users/nabeel/Documents/ShopifyApps/amazon_importer/server/cron/cronUtils.js:10:97)
┃ at listOnTimeout (internal/timers.js:554:17)
┃ at processTimers (internal/timers.js:497:7)
【问题讨论】:
-
getProductPrice(item.productData.ASIN, item.productData.marketPlace)不是函数。 -
...args在此setTimeout调用中将始终为空。注意setTimeout接受delay之后的参数,这些参数成为回调函数的参数。
标签: javascript node.js cron