1.生成Promise实例
var p = new Promise(function(resolve, reject) { // 异步处理 // 处理结束后、判定什么情况下resolve这个Promise,什么情况下reject这个 Promise. // 通常resolve(value),将promise的状态转变成成功,value为之后要用的值 // 通常reject(reason),将promise的状态转变为失败,reason为之后错误处理需要用的值 if ( /* 异步操作成功的判定条件 */ ) { resolve(value); } else { reject(reason); } });
resolve生成Promise实例
//Promise.resolve(someSyncValue).then(...) function func(){ return Promise.resolve.then(function(){ ... return syncValue; }).then(...) }
reject返回一个Promise失败实例
Promise.reject(new Error('some error'))
2. promise的特点
1.promise实例一旦生成,会立即执行
2.promise的状态状态变为resolved或rejected后,不可逆
3.promise的then中的函数有异步特性,不会立即执行
3.promise.then用法
1. then的函数中可以显式return一个值
2. return的是非Promise实例时,该值作为then返回的新的Promise实例的resolve的参数
由于js中函数没有显式return,则会默认返回undefined,因此若在then中执行一个同步
函数或语句,相当于返回undefined
3. return的是一个Promise实例时,相当于then返回的新实例就是这个实例
4. then函数中可以throw一个同步异常
4.promise中使用forEach
异步操作不能直接使用forEach,应该使用Promise.all,在then中返回一个Promise.all,例如:
db.allDocs(...).then(function(result){ return Promise.all(result.rows.map(function(row){ return db.remove(row.doc); })); }).then(function(res){ //all docs have been removed })
5.promise串行执行
1.直接then
promise1.then(function() { return promise2; }).then(function() { return promise3; })
2.promiseFactory加 forEach方法
function fSequecePromise(promiseArray) { var result = Promise.resolve(); promiseArray.map(function(p) { return promiseFactory(p) }).forEach(function(pFactory) { result = result.then(pFactory) }) return result; } function promiseFactory(promise) { return promise; }
6.promise的应用
1.包装同步数据或定时器(例如localStorage、setTimeout、setInterval),提供统一接口
function $localStorage(key) { return Promise.resolve(localStorage.getItem(key)); }
2.包装延迟任务,如模态对话框的打开
$modal.open(...).then(function() { //ok button event }, function() { //cancel button event })
7. Promise包装ajax举例
function getJSON(url) { return new Promise(function(resolve, reject) { let xhr = new XMLHttpRequest(); //神奇的对象 xhr.open('GET', url); xhr.onreadystatechange = handler; // 无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件,handler被调用,然后根据结果resolve,或者reject xhr.responseType = 'json'; xhr.setRequestHeader('Accept', 'application/json'); xhr.send(); function handler() { if (this.readyState === this.DONE) { if (this.status === 200) { resolve(this.response); //successDo(this.response) } else { reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); //faileDo(this.response) } } }; }); }
// 使用promise getJSON(url).then(function onFulfilled(value) { //successDo }, function onRejected(reson) { //faileDo })