#什么是Promise
Promise对象用于表示一个异步操作得最终状态(完成或者失败)以及其返回的值。---MDN
Promise对象中存放着未来我们要做的事情,比如一个异步操作
- 如果返回的结果是成功,那么我们就做成功时候的事情
- 如果返回的结果是失败,那么我们就做失败时候的事情
同步和异步
- 同步任务会阻塞程序执行(alert、for、......)
- 异步任务不会阻塞程序执行(setTimeout、fs.readFile、......)
Promise的then方法
一个 promise 必须提供一个 then 方法以访问其当前值、终值和据因。promise 的 then 方法接受两个参数:
promise.then(onFulfilled, onRejected)。
用通俗的话来说:(参考链接)
then方法提供一个供自定义的回调函数,若传入非函数,则会忽略当前then方法。
回调函数中会把上一个then中返回的值当做参数值供当前then方法调用。then方法执行完毕后需要返回一个新的值给下一个then调用(没有返回值默认使用undefined)。每个then只可能使用前一个then的返回值。
解决异步上的问题
比较传统的回调方式与promise
回调->金字塔型,
function f(cb) {
setTimeout(function() {
cb && cb();
}, 1000);
}
f(function() {
console.log(1);
f(function() {
console.log(2);
f(function() {
console.log(3);
f(function() {
console.log(4);
f(function() {
console.log(5);
f(function() {
console.log(6);
});
});
});
});
});
});
Promise -> 链式 :逻辑更清晰
使用promise去做一个流程的控制,肯定比回调要舒服很多,不管从维护上来讲还是可读性来讲,都是Promise更优一点
function f() {
return new Promise(resolve => {
setTimeout(function() {
resolve();
}, 1000);
})
}
f()
.then(function() {
console.log(1);
return f();
})
.then(function() {
console.log(2);
return f();
})
.then(function() {
console.log(4);
return f();
})
.then(function() {
console.log(3);
return f();
})
.then(function() {
console.log(5);
return f();
})
.then(function() {
console.log(6);
});
如下代码,
let promise = new Promise( resolve => {
console.log('Promise');
resolve();
});
promise.then(function(){
console.log('resolved');
})
console.log('Hello!');
按照顺序输出的结果为 Promise Hello! resolved
。
Promise 新建后立即执行,所以首先输出的是Promise,然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出
网友评论