Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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 为什么这些关于计时器(setTimeout())的代码是这样运行的then()方法?_Javascript_Promise_Frontend_Settimeout_Asynchronous Javascript - Fatal编程技术网

Javascript 为什么这些关于计时器(setTimeout())的代码是这样运行的then()方法?

Javascript 为什么这些关于计时器(setTimeout())的代码是这样运行的then()方法?,javascript,promise,frontend,settimeout,asynchronous-javascript,Javascript,Promise,Frontend,Settimeout,Asynchronous Javascript,解释代码: 正如您在上面所看到的,我创建了一个wait()函数来返回一个承诺,在这个函数中,resolve()将立即执行,一个计时器将在5秒后记录“a”消息 我所期望的是: 因此,我所期望的是执行then()方法,它立即移动到then()方法,因此它将从这里记录“b”消息。由于5秒计时器在后台等待,在Web API中,“a”消息将记录在“b”消息之后 它实际上做了什么: 但结果是如此不同,两条消息立即同时记录,并且“a”在“b”之前,5秒还没有过去。你们能帮我解释一下吗,我真的不明白,我认为我对

解释代码:

正如您在上面所看到的,我创建了一个
wait()
函数来返回一个承诺,在这个函数中,
resolve()
将立即执行,一个计时器将在5秒后记录“a”消息

我所期望的是:

因此,我所期望的是执行
then()
方法,它立即移动到
then()
方法,因此它将从这里记录“b”消息。由于5秒计时器在后台等待,在Web API中,“a”消息将记录在“b”消息之后

它实际上做了什么:

但结果是如此不同,两条消息立即同时记录,并且“a”在“b”之前,5秒还没有过去。你们能帮我解释一下吗,我真的不明白,我认为我对
then()
方法的理解是错误的,所以如果你们知道,请帮我修复,非常感谢

  • 您可以调用
    wait()
  • 等待
    创建新承诺
  • resolve()
    立即解析该承诺,但函数
    resolve
    出现在“继续运行”中,然后再对此执行任何操作
  • 您调用
    console.log('a')
    (假设缺少的
    是问题中的一个输入错误,而不是真正的代码),它记录
    a
  • console.log
    (未定义的
    setTimeout
    )的返回值被传递给
    setTimeout
    (因为它不是函数,所以不做任何事情)
  • 函数结束
  • 承诺决议发生了
  • 然后调用
    函数
  • console.log('b')
    logs
    b

  • 您只是在调用setTimeout时出错

    const wait=function(){
    返回新承诺(功能(解决、拒绝){
    解决()
    setTimeout(()=>console.log('a'),5000)
    })
    }
    
    wait()。然后(()=>console.log('b'))
    wrap console.log in a function虽然这段代码可能会回答这个问题,但提供关于如何和/或为什么解决这个问题的附加上下文将提高答案的长期价值。哦,非常感谢,我修复了我的问题,非常感谢你的朋友,现在代码正在像我预期的那样工作!
    const wait = function () {
      return new Promise(function (resolve, reject) {
        resolve()
        setTimeout(console.log('a'), 5000)
      })
    }
     
    wait().then(() => console.log('b'))