【问题标题】:Return data from setTimeout in node.js从 node.js 中的 setTimeout 返回数据
【发布时间】: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


【解决方案1】:

getProductPrice 确实返回一个函数。您将getProductPrice 的返回值作为fn 的参数传递给fetchPriceAfterDelay

相反,您可以传入不带() 的函数,并将函数的参数作为第二个参数。所以你可以在fetchPriceAfterDelay里面调用FN。

【讨论】:

  • { item.productData.ASIN, item.productData.marketPlace } 在语法上不正确。为什么不简单地getProductPrice.bind(null, item.productData.ASIN, item.productData.marketPlace)
  • @SebastianSimon,感谢您的建议。我已经更改了代码,它现在可以按预期工作。我只需要调用传递getProductPrice() 函数作为参数,如getProductPrice.bind(null, item.productData.ASIN, item.productData.marketPlace) 就可以了。完全忽略了我在作为参数传递时调用函数的事实。我的错。
  • 感谢@Shuffle 指出错误。这是我的一个愚蠢的错误。
猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2017-05-10
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多