You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何用interval-promise链式调用Promise并传递结果?

如何在intervalPromise的Promise链中正确传递结果?

我看了你这段代码,问题主要出在两个地方:tryGetAuthStatus函数的逻辑不完整,以及没有正确使用intervalPromise的回调参数来终止迭代并传递结果。咱们一步步来修正:

1. 修复tryGetAuthStatus的Promise逻辑

你当前的函数在节点不存在时,既没有resolve也没有reject,会导致Promise一直处于pending状态。intervalPromise需要明确的失败信号来触发下一次重试,所以得在节点不存在时主动reject:

const tryGetAuthStatus = (user) => new Promise((resolve, reject) => { 
  var login_node = user.child(provider); 
  if (login_node.exists()) { 
    resolve(login_node.val().status); 
  } else {
    // 节点不存在时抛出错误,告诉intervalPromise需要重试
    reject(new Error("Auth status node not found"));
  }
});

2. 正确使用intervalPromise的回调参数

intervalPromise的回调函数提供了stop()方法,当你成功获取到值后,需要调用它来终止后续迭代,同时返回获取到的状态值,这样intervalPromise就会把这个值resolve出去,传递到下一个then链中。另外注意stopOnError要设为false,这样失败时才会继续重试,直到达到最大次数:

ref.child(uuid).once('value')
.then((user) => intervalPromise( 
  async (iteration, stop) => {
    const status = await tryGetAuthStatus(user);
    // 拿到值后立即停止迭代,并返回这个状态
    stop();
    return status;
  }, 
  attempts_pause, 
  { iterations: attempts_max, stopOnError: false }
)) 
.then((result) => console.log(result)) // 现在应该能正确输出"authorized"这类结果了
.catch((err) => console.error("超过最大重试次数,仍未获取到授权状态:", err));

为什么原来的代码会返回undefined?

  • 你的tryGetAuthStatus在节点不存在时没有reject,导致Promise一直pending,intervalPromise无法判断这次迭代的结果,要么卡住,要么到最后返回undefined。
  • 没有调用stop(),即使某次迭代成功拿到了值,intervalPromise还是会继续执行后续迭代,如果后面的迭代又找不到节点,最终就会返回undefined。
  • stopOnError: true会让第一次失败就终止迭代,而我们需要失败后继续重试,所以这个参数必须设为false。

内容的提问来源于stack exchange,提问作者RedKnight91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:08