承诺不是回调。承诺表示异步操作的未来结果。当然,按照你的方式写它们,你得到的好处很少。但是,如果您按照预期的方式编写异步代码,则可以以类似于同步代码且更易于遵循的方式编写异步代码:
api().then(function(result){
return api2();
}).then(function(result2){
return api3();
}).then(function(result3){
// do work
});
当然,不是更少的代码,而是更具可读性。
但这还不是结束。让我们发现真正的好处:如果您想检查任何步骤中的任何错误,该怎么办?用回调来做这件事简直是地狱,但用承诺,是小菜一碟:
api().then(function(result){
return api2();
}).then(function(result2){
return api3();
}).then(function(result3){
// do work
}).catch(function(error) {
//handle any error that may occur before this point
});
几乎与块相同。try { ... } catch
甚至更好:
api().then(function(result){
return api2();
}).then(function(result2){
return api3();
}).then(function(result3){
// do work
}).catch(function(error) {
//handle any error that may occur before this point
}).then(function() {
//do something whether there was an error or not
//like hiding an spinner if you were performing an AJAX request.
});
更好的是:如果对 、 的 3 个调用可以同时运行(例如,如果它们是 AJAX 调用),但您需要等待这三个调用,该怎么办?如果没有承诺,你应该必须创建某种计数器。有了承诺,使用ES6符号,是另一块蛋糕,非常整洁:api
api2
api3
Promise.all([api(), api2(), api3()]).then(function(result) {
//do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
//handle the error. At least one of the promises rejected.
});
希望你现在以新的眼光看待应许。