javascript - 无法一一执行数组中的承诺

javascript - not able to execute the promise from array one by one

我发现我无法一一兑现承诺

这是我的代码

const promises = mkt.map((marketItem) => {
  return context.program.account.chain
    .fetch(marketItem[0].instrument)
    .then((instrumentRes) => {
      return Test(context, marketItem[0]).then(
        testResult => {
          return Promise.all([
            functionA(),
            functionB(),
          ]).then((result) => {
            return result
          });
        }
      );
    });
});
console.log(promises)
for (let i=0; i < promises.length; i++) {
  const val = await promises[i]();
  console.log(val);
}

错误

promises[i]() is not a function

为什么会这样?我该如何解决?

promises[i]() is not a function

正确,这是因为 promisesPromise 个对象的数组,而不是函数。

您可以将此 promises 数组转储到 Promise.all 并等待它们全部解析。

Promise.all(promises)
  .then(resolvedPromises => {
    // handle array of resolved promises
  });

but I am working on some real time update stuff. If I use Promise.all it will throw error Too many request, so I want to do it one by one to see the effect

为此,我想你想迭代 mkt 数组并等待每个创建的 Promise 解决。将映射回调重构为一个独立函数,您可以在 for-loop 中手动调用该函数,等待 Promise 解决。

const request = (marketItem) => {
  return context.program.account.chain
    .fetch(marketItem[0].instrument)
    .then((instrumentRes) => Test(context, marketItem[0]))
    .then(testResult => Promise.all([functionA(), functionB()]))
    .then((result) => result);
}

for (let i=0; i < mkt.length; i++) {
  try {
    const val = await request(mkt[i]);
    console.log(val);
  } catch(error) {
    // handle any error
  }
}

只需从 await 调用中删除 () 应该就可以了。

  const val = await promises[i];

但是请记住,那时所有的承诺都已经“开始”(我不知道更好的词),你只是在检索结果或 await 呼叫.