定义
先统一执行某个逻辑,不关心如何处理结果,然后,根据结果是成功还是失败,在将来的某个时候调用某个回调函数。这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
实现
创建一个Promise对象,在内部函数中需要的位置调用ok, file形式参数,然后对Promise对象分别定义then和catch时候要执行的回调函数,注意正常时候调用ok,失败时候调用fail:
new Promise((ok, fail) => {
var a = Math.random() * 2;
if (a <= 1) {
ok(a);
}
else {
fail('大于1,不合法')
}
}).then((s) => { console.log('随机数:' + s) }).catch((s) => { console.log(s) })
扩展
Promise还可以做更多的事情,比如,有若干个异步任务,需要先做任务1,如果成功后再做任务2,任何任务失败则不再继续并执行错误处理函数。要串行执行这样的异步任务,不用Promise需要写一层一层的嵌套代码。有了Promise,我们只需要简单地写:
job1.then(job2).then(job3).catch(handleError);
其中,job1、job2和job3都是Promise对象。
Promise还可以并行执行异步任务,用Promise.all()传入多个Promise对象实现:
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 获得一个Array: ['P1', 'P2']
});
多个异步任务时候如果只需要获得先返回的结果时,用Promise.race()实现:
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P1'
});
由于p1执行较快,Promise的then()将获得结果'P1'。p2仍在继续执行,但执行结果将被丢弃。
网友评论