javascript - 暂停执行代码,直到异步函数返回所需的值

标签 javascript reactjs asynchronous react-native async-await

当我等待收到关于是否应该跳过介绍的响应时,它会使用我在开始时设置的值运行 if 语句。下面是代码:

componentWillMount(){
    console.log("Intro component will mount:");
    let skipIntro = false;
    this.checkSkipIntro()
        .then((response)=>{
            skipIntro=response;
            console.log("skipIntro is inside Async: " + skipIntro);
    });
    console.log("skipIntro is: " + skipIntro);
    if(skipIntro){
        console.log("skipping Intro");
        Actions.login();
    }
}
async checkSkipIntro() {
    let skipIntro = await AsyncStorage.getItem("skipIntro");
    console.log("Skip Intro: " + skipIntro);
    if (skipIntro === "yes"){
        console.log("returning True");
        return true;
    }
    else{
        console.log("returning False");
        return false;
    }
}

日志打印出来:

Intro.js:9 Intro component will mount:
Intro.js:16 skipIntro is: false
Intro.js:37 Skip Intro: yes
Intro.js:39 returning True
Intro.js:14 skipIntro is inside Async: true

如果您在调试器中注意到,console.log("skipIntro is: "+skipIntro); at Intro.js:16 在 console.log("skipIntro is inside Async: "+skipIntro); 之前运行 在 Intro.js:14。我不确定如何暂停代码的执行,直到函数返回适当的值。

我期望日志输出:

Intro.js:9 Intro component will mount:
Intro.js:14 skipIntro is inside Async: true
Intro.js:37 Skip Intro: yes
Intro.js:39 returning True
Intro.js:16 skipIntro is: true

最佳答案

要暂停直到响应到来,您需要将代码转移到回调方法内或 promise 内的 .then 方法中。

改变这个...

componentWillMount(){
    console.log("Intro component will mount:");
    let skipIntro = false;
    this.checkSkipIntro()
        .then((response)=>{
            skipIntro=response;
            console.log("skipIntro is inside Async: " + skipIntro);
    });
    console.log("skipIntro is: " + skipIntro);
    if(skipIntro){
        console.log("skipping Intro");
        Actions.login();
    }
}

对此...

componentWillMount(){
    console.log("Intro component will mount:");
    let skipIntro = false;
    this.checkSkipIntro()
        .then((response)=> {
            skipIntro=response;
            console.log("skipIntro is inside Async: " + skipIntro);
            
            console.log("skipIntro is: " + skipIntro);
            
            if(skipIntro){
                console.log("skipping Intro");
                Actions.login();
            }
    });
}

因为如果你注意到了。

此代码永远不会运行!

    if(skipIntro){
        console.log("skipping Intro");
        Actions.login();
    }

因为skipIntro在运行时是假的。

简单的概念是 JavaScript 在等待 promise 履行时运行其他所有事情。

然后,当 Promise 响应到来时,它返回到 .then 方法。

因此,如果您想等待响应来导航/调用其他函数,您可以在 .then 函数或回调函数中执行此操作。

关于javascript - 暂停执行代码,直到异步函数返回所需的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46260442/

相关文章:

reactjs - 无法使用React将nginx代理设置为Docker容器

javascript - 未捕获的语法错误 : Unexpected identifier when trying to import React

reactjs - react 路由器 : route-based navbar content

c# - 异步鸡和蛋故事的最佳解决方案

javascript - 如何从异步调用返回响应?

javascript - 如何在更改大小后覆盖表格元素

javascript - 如何根据用户输入的数字动态地将文本字段添加到表单

Javascript 图像大小调整在 IE11 中无法正常工作,但在剩余版本(10,9,8)中工作

javascript - 如何确定用户选择范围

javascript - 我可以重构嵌套的 async.each 循环吗?