Promise是什么
将异步操作队列化的一系列计算,使其能按照期望的顺序执行。
异步操作常见语法
- 事件侦听与响应
docement.getElementById('start').addEventListener('click',start,false);
function start(){
//响应的操作
}
//JQuery 用'.on()' 侦听
$('#start').on('click',start);
- 回调
$.ajax('http:baidu.com',{
success:funciton(res){
//回调函数
}
});
//页面加载完毕后回调
$(function(){
//回调函数
});
异步操作的问题
- 嵌套层次很深,难以维护
- 无法正常使用return和throw
- 无法正常检索堆栈信息
- 多个回调之间难以建立联系
Promise详解
- Promise 是一个代理对象,它和原先要进行的操作并无关系。
- 它通过引入一个回调,避免更多的回调。
new Promise(
function(resolve,reject){
resolve();//数据处理完成
reject();//数据处理出错
}
).then(function A(){
//成功、下一步
},function B(){
//失败,做相应处理
});
Promise有3个状态
pending 待定-初始状态
fulfilled 实现-操作成功
rejected 被否决-操作失败Promise状态发生改变,就会触发.then()里的响应函数处理后续步骤。
- Promise状态一经改变,不会在变。
- 简单实例
start1 两秒后输出 hello world
console.log("start1");
new Promise(resolve => {
setTimeout( () => {
resolve('hello');
},2000);
}).then( value => {
console.log( value + ' world');
});
start2 两秒后输出 hello 再两秒后输出 world World
console.log('start2');
new Promise( resolve => {
setTimeout( () => {
resolve('hello');
}, 2000);
}).then( value => {
console.log(value);
return new Promise( resolve => {
setTimeout( () => {
resolve(' world')
}, 2000);
});
}).then( value => {
console.log( value + ' world');
});