簡體   English   中英

如何將 Promises 與間隔承諾 Node.js 模塊鏈接?

[英]How do I chain Promises with interval-promise Node.js module?

我正在使用“間隔承諾”(此處為 github 存儲庫)模塊來讀取 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

如您所見,我正在返回 intervalPromise Promise 以繼續 promise 鏈。 當從 firebaseTryGetAuth 返回的 promise 解析時,它返回正確的結果(例如“授權”),但鏈中的最后一個“then”沒有從返回的 intervalPromise 中得到結果。

我怎樣才能傳播結果?

interval()返回的 promise 不會從您自己的異步操作中解析/傳遞一個長值。 它只是做一個resolve()調用來結束它自己的 promise

https://github.com/andyfleming/interval-promise/blob/078528e4096649a56dd2473986d7a1a7eba7909f/src/index.js#L31

 if (currentIteration === settings.iterations || stopRequested) { rootPromiseResolve() return }

由於這可以做幾件事:

  1. 將狀態值保存到外部 scope 變量並在最后一個then()回調中使用它
  2. 直接從您傳遞給interval()的 function 檢查狀態

//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();
      }
    }) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM