javascript 蓝鸟跳过的承诺示例 "then"

javascript promise example with bluebird skips "then"

我试图了解有关 promises 的信息,但现在遇到了困难。 这是我的例子,但它不起作用:

<html>
  <head>
    <title>test page</title>
  </head>
  <body>
    <script type="text/javascript" src="bluebird.js"></script>
    <script type="text/javascript" >
      function doTheThing () {
        return new Promise (function (resolve, reject) {
          setTimeout(function(){alert("2");},1000)
          alert("1");
        });
      }
      doTheThing().then(
        function() {
          alert("3");
        }, function(error) {
          alert("5");
        }
      );
    </script>
  </body>
</html>

这会先提示“1”,然后提示“2”,仅此而已。

为什么从不提醒“3”?为什么 then() 根本不执行?

您需要解决 Promise:

function doTheThing () {
   return new Promise (function (resolve, reject) {
     setTimeout(function(){ 
       alert("2"); 
       resolve(); 
     }, 1000)
     alert("1");
   });
 }

想象一下,如果您的代码采用回调参数,而不是返回 Promise:

function doTheThing (doneCallback) {
   setTimeout(function(){ 
     alert("2"); 
     doneCallback(); 
   }, 1000);
   alert("1");
 }

您需要调用 doneCallback 以将值传递给调用异步代码(或者只是让它知道它可以继续,就像在本例中一样)。解决(或拒绝)一个 Promise 与此类似 - 它启用异步流控制和值传递。

Promise 必须是 resolvedrejected 才能继续将执行传递给下一个 then 成功或错误处理程序。所以在你的 doTheThing 函数中你需要调用 resolve。我已经对您的代码进行了一些修改,以证明通过调用 resolve 可以将控制权传递给成功处理程序,事实证明 3 是通过调用 resolve("3").[= 给出的19=]

function doTheThing () {
    return new Promise (function (resolve, reject) {
        setTimeout(function(){alert("2");},1000)
        alert("1");
        resolve("3");
    });
}

doTheThing().then(function(value) {
    alert(value);
}, function(error) {
    alert("5");
});
new Promise (function (fulfill, reject) {
    setTimeout(function(){alert("2");},1000)
    alert("1");
});

要让一个 promise 不挂起,你必须 fulfill(通过执行 fulfill 函数,或者 reject(通过执行 reject 函数),只有这样 .then(onFulfilled, onRejected) 中的相应函数才会被触发

了解有关承诺的更多信息 here or here