Javascript 如何使用interval promise Node.js模块链接承诺?

Javascript 如何使用interval promise Node.js模块链接承诺?,javascript,node.js,firebase,promise,google-cloud-functions,Javascript,Node.js,Firebase,Promise,Google Cloud Functions,我正在使用“interval promise”(间隔承诺)模块读取Firebase实时数据库节点中的值,以进行持续登录 其思想是从一个可能还不存在的实时数据库节点读取一个“状态”键,然后重试,直到它有一个值为止 const tryGetAuthStatus = (user) => new Promise((resolve, reject) => { var login_node = user.child(provider);

我正在使用“interval promise”(间隔承诺)模块读取Firebase实时数据库节点中的值,以进行持续登录

其思想是从一个可能还不存在的实时数据库节点读取一个“状态”键,然后重试,直到它有一个值为止

const tryGetAuthStatus = (user) =>
        new Promise((resolve, reject) => {
            var login_node = user.child(provider);

            if (login_node.exists()) {
                resolve(login_node.val().status)
            }
        })

ref.child(uuid).once('value')     //Returns a promise
    .then((user) => 
        intervalPromise(
            async (iteration, stop) => await tryGetAuthStatus(user),    //Returns a promise
            attempts_pause,
            { iterations: attempts_max, stopOnError: true }
        )
    )
    .then((result) => console.log(result))    //undefined
正如你所看到的,我将返回间隔承诺,以继续承诺链。 当firebaseTryGetAuth返回的承诺解析时,它返回正确的结果(例如“已授权”),但链中的最后一个“then”不会从返回的intervalPromise中获得任何结果

如何传播结果?

interval()
返回的承诺不会解析/传递您自己异步操作的长值。它只是执行一个
resolve()
调用来结束自己的承诺

因此,可以做以下几件事:

  • 将status的值保存到外部作用域变量,并在上一次
    then()
    回调中使用它
  • 直接从传递到
    interval()的函数中检查状态

  • interval()
    返回的承诺不会解析/传递您自己异步操作中的长a值。它只是执行一个
    resolve()
    调用来结束自己的承诺

    因此,可以做以下几件事:

  • 将status的值保存到外部作用域变量,并在上一次
    then()
    回调中使用它
  • 直接从传递到
    interval()的函数中检查状态


  • 谢谢Patrick,我通过更好地阅读源代码找到了答案,之前我误解了它的解决方法。你的方法是有效的。谢谢你,帕特里克,我通过更好地阅读源代码找到了答案,我以前误解了它的解决方法。你的方法是有效的。
    if (currentIteration === settings.iterations || stopRequested) {
      rootPromiseResolve()
      return
    }
    
    //only use in then() callback
    //outside use may result in use before set
    let authStatus = null;
    
    let authCheck = (user)=>{
      return async (iteration, stop) => {
        let status = await tryGetAuthStatus(user)
        //set variable for use in then()
        authStatus=status; 
    
        //or check status now and do so some action
        //instead of in some later then()
        if(status == whatyouwant){ 
          someAction()
          //call stop() since no reason to continue 
          //the async loop
          stop(); 
        }
      };
    };
    
    ref.child(uuid).once('value')
        .then((user) => 
            intervalPromise(
                authCheck(user),
                attempts_pause,
                { iterations: attempts_max, stopOnError: true }
            )
        )
        //if you want to go the set outer scope variable route
        .then(() =>{
          if(authStatus == whatever){
            doSomeAction();
          }
        })