2015-08-18 87 views
1

我试图找出承诺,我现在很难过。 这里是我的例子不工作:JavaScript承诺蓝鸟跳过示例“then”

<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()根本不执行?

+4

因为您的承诺既没有解决也没有被拒绝? –

回答

3

您需要解决的承诺:

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

试想一下,如果你的代码了一个回调参数,而不是返回一个承诺:

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

你需要调用doneCallback传递一个值的调用异步代码(或者只是让它知道它可以继续,就像在这种情况下一样)。解决(或拒绝)Promise与此类似 - 它支持异步流量控制和值传递。

2

承诺必须为resolvedrejected,然后才能继续执行下一个then成功或错误处理程序。因此,在您的doTheThing功能中,您需要拨打resolve。我已经修改了一下你的代码来证明通过调用resolve你将控制权传递给成功处理程序,这通过调用resolve("3")给出值3这一事实很明显。

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"); 
}); 
0
new Promise (function (fulfill, reject) { 
    setTimeout(function(){alert("2");},1000) 
    alert("1"); 
}); 

的承诺没被挂起,你必须完成(通过执行履行职能,或拒绝(通过执行拒绝功能),只有这样,在.then(onFulfilled, onRejected)相应的功能被解雇

了解更多关于承诺herehere