在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作、浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:
function callback() {
console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数
console.log('after setTimeout()');
上面代码执行的结果为:
before setTimeout()
after setTimeout()
(等待1秒后)
Done
Promise,即承诺,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
写法是: new Promise(function(){});
我们先看一个最简单的Promise例子:
eg:生成一个0-2之间的随机数,如果小于1,则等待一段时间后返回成功,否则返回失败
new Promise(function(resolve, reject) {
console.log('start promise');
var randomNum = Math.random() * 2;
console.log(`此时随机数为: ${randomNum}.`);
setTimeout(function (){
if (randomNum<1) {
console.log('call resolve()');
resolve('200 OK');
}else{
console.log('call reject()');
reject(`随机数是 ${randomNum} > 1.`);
}
}, 1000);
}).then(function(result){
console.log('成功:'+result);
}).catch(function(reason){
console.log('失败:'+reason);
})
上面Promise例子成功(success)返回时的结果是:
start promise
此时随机数为: 0.03817477458072682.
call resolve()
成功:200 OK
失败返回的结果为:
start promise
此时随机数为: 1.6242283476844261.
call reject()
失败:随机数是 1.6242283476844261 > 1.
代码解析:Promise 函数有两个参数(resolve,reject),这两个参数都是函数。
如果执行成功,我们将调用: resolve('200 OK');
如果执行失败,我们将调用: reject('随机数是 '+randomNum+' > 1.');
Promise是一个构造函数,自身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。