【问题标题】:Fetch Objects unexpectedly executing获取对象意外执行
【发布时间】:2023-02-04 09:58:34
【问题描述】:

我正在使用节点。我有一个 api 设置作为 netlify 无服务器函数,这样我就可以并行运行多个进程。

作为其中的一部分,我想要创建一个未执行的获取对象承诺的数组,然后我可以使用类似的东西并行执行它:

const responses = await Promise.allSettled(promiseArray);

到目前为止我有:

for (let i = 0; i < groupedRecords.length; i++) {
  const groupedRecord = groupedRecords[i];
  const fetchObjects = await createFetchObjectArray(groupedRecord);

}

async function createFetchObjectArray(records) {


  const fetchURL = (obj) => fetch('http://localhost:8888/.netlify/functions/meta1', {
  method: 'POST',
  body: JSON.stringify(obj),
  headers: { 'Content-Type': 'application/json' }
  });

 let outputArray = [];
 for (let i = 0; i < (records.length); i++) {
    const record = await records.pop();
    const obj = { "_id": record._id };
    const fetchObj = fetchURL(obj);
    outputArray.push(fetchObj);

  }

  return outputArray;

}

我希望将一系列承诺放入“fetchObjects”中,但它们似乎正在尝试执行。我正在看:

FetchError: request to http://localhost:8888/.netlify/functions/meta1 failed, reason: connect ECONNREFUSED 127.0.0.1:8888

如何防止获取对象执行?

【问题讨论】:

  • groupedRecords是什么数据结构?
  • await records.pop() 真的没有意义。你传递的是什么records
  • 然后我可以使用Promise.allSettled之类的东西并行执行“ - 你误解了承诺的工作方式。你不能“执行”它们,它们不是函数。你所能做的就是等待它们。这也是Promise.allSettled所做的:它创建了一个新的承诺等待所有输入都承诺结算。根本不可能“阻止获取对象执行" - 呼叫fetch()执行函数,它返回一个让你等待结果的承诺。

标签: javascript node.js promise fetch


【解决方案1】:

调用fetchURL会立即执行。 awaitPromise.allSettled 不是机制开始异步操作,它们是等待已经开始的操作的机制。

如果你想构建一个函数数组而不是立即调用它们,而不是:

const fetchObj = fetchURL(obj);
outputArray.push(fetchObj);

你可能只想:

outputArray.push(() => fetchURL(obj));

如果你以后想使用Promise.allSettled,你可以这样做:

Promise.allSettled(outputArray.map(foo => foo());

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多