मैं किसी मान को पढ़ने के लिए 'अंतराल-वादा' (github repo here) मॉड्यूल का उपयोग कर रहा हूं चल रहे लॉगिन के लिए एक फायरबेस रीयलटाइम डीबी नोड में।

विचार एक रीयलटाइम डीबी नोड से 'स्थिति' कुंजी को पढ़ने का है जो अभी तक अस्तित्व में नहीं है, और जब तक इसका कोई मूल्य न हो तब तक पुनः प्रयास करें।

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 से लौटा हुआ वादा हल हो जाता है, तो यह सही परिणाम देता है (जैसे "अधिकृत"), लेकिन श्रृंखला में अंतिम 'तब' को दिए गए अंतराल से कोई परिणाम नहीं मिलता है।

मैं परिणाम का प्रचार कैसे कर सकता हूं?

0
RedKnight91 19 नवम्बर 2019, 13:10

1 उत्तर

सबसे बढ़िया उत्तर

interval() का लौटाया गया वादा आपके स्वयं के एसिंक्स ऑपरेशन से एक लंबे मूल्य को हल/पास नहीं करता है। यह अपना वादा खत्म करने के लिए सिर्फ एक resolve() कॉल करता है

https://github.com/andyfleming/interval- वादा/बूँद/078528e4096649a56dd2473986d7a1a7eba7909f/src/index.js#L31

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

इसके कारण कुछ चीजें कर सकते हैं:

  1. स्थिति के मान को बाहरी स्कोप वेरिएबल में सहेजें और इसे अपने अंतिम then() कॉलबैक में उपयोग करें
  2. जिस फ़ंक्शन को आप interval() पर भेज रहे हैं, उससे सीधे स्थिति जांचें

//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();
      }
    }) 
2
Patrick Evans 19 नवम्बर 2019, 14:17