【问题标题】:Promise resolve confusion承诺解决混乱
【发布时间】:2017-10-14 17:07:32
【问题描述】:

当我解决承诺时,该函数应该继续执行:

function test(){
    return new Promise(resolve=>{
        resolve(5)
        setTimeout(()=>{console.log(7)}, 2000}
    })
}

然后我像这样调用函数

test().then(console.log);

所以它打印出 5,然后在 2 秒后打印出 7,正如我所料。 但是,如果我在 resolve() 之后使用同步的东西,它的工作方式会有所不同:

function test(){
    return new Promise(resolve=>{
        resolve(5)
        for(let i = 0; i < 100; i++)
            console.log(i)
    })
}

现在它打印从 0 到 100 的数字,然后打印 5。但我希望它通过 resolve() 返回 5,然后才打印所有其余的东西。

【问题讨论】:

  • 没有。你应该做return resolve(5) 然后你什么都不做。否则,你为什么要解决....
  • @yBrodsky 不正确。您可以使用 resolve 而不显式返回它。 return 唯一重要的是 new Promise
  • 关键字是应该。任何实际示例,您希望在解决后继续做一些事情,在承诺内?。
  • 这是因为 then-callback 是在 Promise body 之后执行的。 resolve() 是最后执行的.then cb 的方式
  • @yBrodsky,我收到了很多找到的同行,如果其中一个是我正在寻找的,我会立即解决。但该功能将继续与其他同行合作。

标签: javascript asynchronous promise


【解决方案1】:

代码给出了预期的结果。当您立即使用 5 解析时,该函数尚未完成执行,因此它将运行其余代码。完成后,调用堆栈为空,异步 then 有机会运行。这两个程序之间的区别在于第二个程序立即记录,因为它不必等待函数完成执行。它是同步的。

【讨论】:

    【解决方案2】:

    我认为这与 javascript 的 event loop 有关。通过该链接,您可以观看有关 JS 中事件循环的精彩视频。 我不确定,但似乎 resolve() 内部的内容是异步调用的,但 for 循环是同步的,这就是为什么将 resolve 里面的内容放入队列并立即执行 for 循环的原因。在“正常”执行过程完成后,resolve 完成它的工作,返回 5。

    setTimeout 的示例中,您已将代码放入队列中,但要稍后(2000 毫秒)执行。由于 5 没有做任何事情,它会立即返回(虽然是异步的)并且在 2 秒后运行您的代码。观看视频。

    【讨论】:

      【解决方案3】:

      我想通了。 Nodejs 从左到右运行代码。 首先它给了我一个以 resolve reject 作为参数的函数,然后它执行这个函数。它解决了价值。然后它遇到一个同步的for循环,因此它必须同步执行它。然后它返回一个已经解决的承诺,然后我应用方法。 then() 在 promise 被解决时执行回调。它已经解决了。它打印出我的解析值 如果你使用回调,它会有所不同:

      function test(callback){
          callback(7)
          for(let i = 0; i<100; i++){
              console.log(i)
          }
      }
      

      它会首先打印(7),然后才是所有剩余的数字 但它只有在您知道回调将被调用一次时才有效。因为否则会破坏逻辑。

      【讨论】:

      • 显然,因为回调是同步的,并且承诺是异步实现的。但这并不能回答您的问题 - 为什么它首先循环然后解决承诺。
      • 确实是这样,因为现在我知道由于 Promise 的实现而存在差异
      • 可能现在我只需要谷歌一下承诺是如何做出的
      【解决方案4】:

      所以,我想确保我们在同一页面上的一些事情。您的 test 函数的 setTimeout 是异步的。是的,它在一个 Promise 中,但是你以一种不受控制的方式将它发送到了事件循环中。

      setTimeout(()=&gt;{console.log(7)}, 2000} //not controlled in your first function

      无论你在resolve 中放置什么,都是唯一受promise 控制的东西。你使用 Promise 的方式不是它们应该被使用的方式。如果这让您感到困惑,您可能需要回到基础知识并进一步阅读。

      edit:我似乎没有正确表达自己,因此获得了相当多的盐分。更好的解释:

      您应该像对待退货声明一样对待promise。除了单个 resolve 语句之外,promise 函数不应执行任何其他输出操作。这可以在 另一个 函数的后续操作中同步控制。关键字是另一个。

      function test(){
          return new Promise(resolve=>{
              resolve(5)
          })
      }
      
      function loopTest() {
        test().then( (num) => {
          console.log(num)
          for (let i = 0; i < 10; i++) {
            console.log(i)
          }
        })
      } // what you were trying to actually accomplish
      
      loopTest()
      

      【讨论】:

      • 谢谢。但抱歉,我不太明白你在“不受控制”下想说什么
      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 2015-06-24
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多