如何等待javascript中存在特定值?
所以我一直在用谷歌搜索我的答案,但没能找到。我想知道我如何等待通过使用承诺来定义一个值,而不是像使用以下命令这样的暴力方法:如何等待javascript中存在特定值?,javascript,reactjs,react-redux,Javascript,Reactjs,React Redux,所以我一直在用谷歌搜索我的答案,但没能找到。我想知道我如何等待通过使用承诺来定义一个值,而不是像使用以下命令这样的暴力方法: while(true){检查条件,然后中断} 这是我最初的暴力方法,但显然不是一个好的解决方案: const waitToken=新承诺((解析、拒绝)=>{ while(true){ if(getState().auth.token){ 解析(真) 打破 } } }) ** 编辑:getState方法不是异步的,否则它会更容易实现,我之所以要实现它,是因为从用户
while(true){检查条件,然后中断}
这是我最初的暴力方法,但显然不是一个好的解决方案:
const waitToken=新承诺((解析、拒绝)=>{
while(true){
if(getState().auth.token){
解析(真)
打破
}
}
})
** 编辑:getState方法不是异步的,否则它会更容易实现,我之所以要实现它,是因为从用户登录到令牌在redux状态下可用之间有一个很小的延迟 **
我正在做一个react-redux项目,我想实现它,但是,我的代码与此无关,因为我不想得到具体案例的答案。我将感谢任何帮助 Redux允许您订阅商店。每当调度操作时,都将调用回调 这意味着你可以这样做:
const awaitToken = new Promise(resolve => {
if (getState().auth.token) return resolve(true);
const unsubscribe = subscribe(() => {
if (!getState().auth.token) return;
unsubscribe();
resolve(true);
});
});
可以找到有关订阅的其他信息。您可能还想添加超时,但这可能取决于用例。推送与拉送。 根据你提出问题的方式,我将做一些假设:假设是没有人解释推-拉二分法。在没有SO社区的情况下,了解如何在未来解决此类问题非常重要 承诺和回调由ECMA机构设计,使开发人员能够拉取异步任务的结果。你可以把“拉”想象成拿起电话,打电话给你的朋友,问他你的包裹是否已经送到了你在送货单上使用的地址。显然,在包到达之前,您不会一直保持通话状态,因此您必须不断重复此过程,直到您的朋友说“是的,您的包已经到达”(例如
Promise.resolve(package)| cb('package has arrived')
)
然后ECMA机构给了我们ES8。有了它,PUSH方法论,它正好解决了你所面临的问题,我可能会补充说,这是非常令人钦佩的。async/await
二分法使开发人员不再需要拿起电话给朋友打电话。相反,你的朋友拿起电话给你打电话说:“嘿,伙计,过来把你的东西从我的门廊拿开,它来了。”这是一个推<代码>异步/等待和生成器
如果您愿意,请详细介绍async/await
理论
解决方案
函数*fetchToken(){
const{auth}=getToken();//getToken()是异步的,在返回值之前阻止控制流。
产生授权令牌;
}
const tokenGen=fetchToken();
const{value:token}=tokenGen().next();
console.log('token:',token);//[jwt令牌]
这里有一个非阻塞解决方案,可以轻松地在promises中使用同步函数。 额外的超时可以节省大量等待时间
let arrivedToken = new Promise((resolve, reject) => {
/* how often you wanna check? */
let interval = 20;
/*how long do you want to wait? */
let timeOut = 4000;
let timer = setInterval(() => {
timeOut -= interval;
if (timeOut < 1) {
clearInterval(timer);
reject(new Error('catching token timed out'));
}
let token = getState().auth.token;
if (token)
resolve(token);
}, interval);
};
您可以使用
async/await
或then/catch
语法。你的暴力方法将永远无法工作,因为它将永远在单个线程中循环,甚至无法更新getState()
中的状态。请使用async/wait,因为发生了异步调用。是否getState()
异步?或者只是在填充之前进行轮询?什么设置.auth.token
?更好的解决方案是使用该代码。
arrivedToken
.then(token => {
/* whatever you want */
})
.catch(error => {
/* handle the timeout */
})
;