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
相关产品推荐
相关产品推荐

