Javascript 如何使用interval promise Node.js模块链接承诺?
我正在使用“interval promise”(间隔承诺)模块读取Firebase实时数据库节点中的值,以进行持续登录 其思想是从一个可能还不存在的实时数据库节点读取一个“状态”键,然后重试,直到它有一个值为止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);
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()
调用来结束自己的承诺
因此,可以做以下几件事:
then()
回调中使用它interval()的函数中检查状态
interval()
返回的承诺不会解析/传递您自己异步操作中的长a值。它只是执行一个resolve()
调用来结束自己的承诺
因此,可以做以下几件事:
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();
}
})