Promises通过一种简单干净的方法实现JavaScript的异步编程,它是ES6的新功能。先看下面几个例子(可以使用node测试):
SyncCallback(同步回调):
function notifyAll(a, b)
{
console.log("starting notification process");
a();
b();
}
function notify1()
{
console.log("Hey, one.");
}
function notify2()
{
console.log("Hey, two.");
}
notifyAll(notify1, notify2);
AsyncCallback(异步回调,基于setTimeout):
function notifyAll(a, b)
{
setTimeout(function(){
console.log("starting notification process");
a();
b();
}, 2000);
}
function notify1()
{
console.log("Hey, one.");
}
function notify2()
{
console.log("Hey, two.");
}
notifyAll(notify1, notify2);
再看一个基于setTimeout极端的异步回调:
setTimeout(function() {
console.log("one");
setTimeout(function() {
console.log("two");
setTimeout(function() {
console.log("three");
}, 1000);
}, 1000);
}, 1000);
好了,ES6 Promises来了:
function getSum(n1, n2)
{
varIsNegative = function()
{
return n1 < 0 || n2 < 0;
}
var promise = new Promise(function(resolve, reject) {
if (varIsNegative())
{
reject(Error("Negatives not supported."));
}
resolve(n1 + n2);
});
return promise;
}
getSum(5, 7).then(
function(result) {
console.log(result);
},
function(error) {
console.log(error);
}
);
现在是ES6 Promises的连续事件(Continuation Events):
function getSum(n1, n2) {
var checkNums = function() {
return n1 < 0 || n2 < 0;
}
var promise = new Promise(function(resolve, reject) {
if (checkNums()) {
reject(Error("Invalid number input."));
}
resolve(n1 + n2);
});
return promise;
}
getSum(2, 3)
.then(function(result) {
console.log(result);
return getSum(10, 20);
}, function(error) {
console.log(error);
})
.then(function(result) {
console.log(result);
}, function(error) {
console.log(error);
});