【问题标题】:Why need to use promise as a wrapper for asynchronous callbacks为什么需要使用 promise 作为异步回调的包装器
【发布时间】:2019-07-13 20:07:54
【问题描述】:

我是 JS 新手,想了解 Promise 是 JS。到目前为止,我知道 Promise 不是异步的,也就是说,正如您在下面的代码中看到的那样 new Promise( function ( ) { console.log( 'b' ); setTimeout( function ( ) { console.log( 'D' ); }, 0 ); } ); 当返回 promise 对象时,只有 setTimeOut 异步执行,promise 充当该 setTimeOut 的包装器。问题是为什么需要将 setTimeOut 之类的异步代码包装在 promise 中,或者在 promise 中使用 XHR 对象完成的 Ajax 请求。

【问题讨论】:

  • 由于所显示的承诺从未得到解决,因此该示例不是一个好示例。还承诺 异步的,因此您对此的理解不正确
  • @charlieftl 我刚刚在他的上一个问题中告诉 OP 的相反 :)
  • @charlieftl 我不需要示例,我知道规范(所有相关部分)。我认为初学者更容易理解,如果我们说 Promise 不是异步的,而是它们是异步调用的回调的包装器。如果您阅读了 OPs 上一个问题,您就会明白其中的原因
  • @charlietfl,谢谢你的cmets,请你看一下这个promise据说是同步的stackoverflow.com/questions/36588775/…
  • @JonasWilms 猜你告诉他们它执行的代码是同步的,这是有道理的......正如 op 所说,它是模糊的

标签: javascript


【解决方案1】:

为了确保您不必使用 Promises,您只需使用回调即可完成所有工作。但是 回调 本身并不能很好地扩展,因为它们中的多个不能很好地协同工作。

例如,让我们使用一个创建新用户帐户的异步函数:

  User.create("jonas", result => {
    alert("New account created");
  });

现在,让我们创建 10 个帐户……哦,对了,它是如何工作的?试一试,你会发现它要复杂得多。这就是 Promises 变得相关。如果User.create() 会创建一个promise,我们可以轻松地在它们上使用Promise.allPromise.race,用.then(...) 链接它们...

  Promise.all([
    User.create("jonas"),
    User.create("MM")
  ]).then(result => {
    alert("Two users were created");
  });

旁注:只有当你resolve它们时,承诺才有意义,所以一个很好的例子是:

  function timer(time) {
    return new Promise( function (resolve) { 
      console.log("promise created synchronously"); 
      setTimeout( function ( ) {
       console.log("callback called asynchronously and promise resolved");
       resolve();
     }, time); 
   });
 }

timer(100).then(/*...*/);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多