【问题标题】:How to check what an async function returns如何检查异步函数返回的内容
【发布时间】:2021-06-18 12:31:42
【问题描述】:

我知道JavaScript wait for asynchronous function in if statement [duplicate]How do I return the response from an asynchronous call? 的问题,但是(可能因为我是一个绝对的 JS 初学者)我无法实现这些想法。

使用async await documentation,我可以使这个例子工作:

let hello = async () => { return "Hello" };
hello().then((value) => console.log(value))

它只输出Hello。但是,我希望我的代码稍后检查函数hello 返回的内容。像这样的:

if ( /* what comes here? */) {
    console.log("Hello was said")
}

我怎么能这样做?如何制定这个 if 语句来检查 hello 是否确实返回了“Hello”?

【问题讨论】:

  • 如果你真的是一个“绝对的初学者”,也许从asyncawait开始并不是最好的主意。
  • 是的,好点。试图实现需要它的东西。这个,特别是:stackoverflow.com/questions/66735555/…。我认为这个问题相当具体,我正在尝试提出一个更广泛适用的示例,该示例重现了我在特定案例中遇到的相同问题,这就是我最终出现在上面帖子中提到的页面上的方式;如果您知道避免这些主题的解决方法,那也很有帮助。
  • 什么不起作用?

标签: javascript node.js asynchronous


【解决方案1】:

这取决于您对“稍后”的含义。

  1. 您可以将其保存为常规变量并导出(这不是 async-await 的问题)Export Variables
  2. 如果您想以安全的方式执行此操作,并且“稍后”是在您需要将其发送到数据库之后的某一天。

【讨论】:

    【解决方案2】:

    if 语句可以像这样包裹在异步函数中:

    let hello = async () => { return "Hello" };
    
    async function foobar() {
      if(await hello() == 'Hello')
        console.log('yay')
    }
    
    foobar()
    

    await 只能用于异步函数。

    Promise 继续为您提供 Promise 作为回报,但 await 可以在异步函数中评估 Promise。

    【讨论】:

      【解决方案3】:

      hello().then((value) => ...) 基本上意味着如果promise (await) 被实现,它应该调用一个function(value = <return_value>){} ...所以...

      hello().then((value) => {
          if(value == 'Hello'){
              console.log("Hello was said");
          }
      });
      

      【讨论】:

        【解决方案4】:
        1. async/Promise 引入了一个独立的执行,否则会阻塞
        2. “稍后”发生在其阻塞线程完成时
        3. 附加到 .then() 的回调将在“稍后”时间执行

        这是一个可以消除一些迷雾的示例。

        • 注意调用 setFree() 之后的两个独立线程。
        • gone() 继续做自己的事
        • setFree() 立即返回。
        • 两个执行共享一个公共变量waitOver
        • then() 处理程序“知道”并在“稍后”时间处理事情
        • 该处理程序更新公共变量 waitOver 以通知那些有兴趣了解“稍后”时间会发生什么的人

        "

        let waitOver = false;
        
        let whatToDo = setFree("Jill",5);
        console.log(whatToDo);
        
        let theWait = setInterval( () => {
          
            waitOver ? clearInterval(theWait) :
            console.log(" and .. wait");
        }, 1000);
        
        
        
        function gone(secs) {
            return new Promise(resolve => setTimeout(resolve, secs*1000));
        }
        
        function setFree(someone,secs) {
            
            console.log(`If you truly love ${someone}, set ${someone} free`);
        
            gone(secs).then(() => {
                console.log(`Back! ${someone} is yours`);
                waitOver = true;
                return  `${someone} is yours`;
              }).catch(`Hunting ${someone} down and kill ${someone}`);   
            return " Here you wait ... ";
        }
        

        这就是你会得到的:

            If you truly love Jill, set Jill free
             Here I wait ... 
             and .. wait
             and .. wait
             and .. wait
             and .. wait
            Back! Jill is yours*
        

        还请注意,在调用 setFree() 之后,对主执行线程中的 waitOver 的任何检查都将是错误的,除非该检查是在 gone() 已被处理后进行的通过它的 .then() 处理程序。

        如果没有 .then() 处理程序,那么gone() 就会去树林里,你将永远不知道吉尔是否会回来,即使她回来了,因为那个完成从来没有处理:-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-23
          • 2013-05-15
          • 2015-08-24
          • 2022-01-15
          • 1970-01-01
          • 2019-05-07
          • 2020-07-29
          • 1970-01-01
          相关资源
          最近更新 更多