Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何等待javascript中存在特定值?_Javascript_Reactjs_React Redux - Fatal编程技术网

如何等待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令牌]
异步函数fetchToken(){ const{auth}=await getToken();//等待块的控制流,直到函数解析为止。 返回auth.token; } const token=fetchToken(); 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 */
  })
;