es6的集成方法
Promise
pending: 初始状态,不是成功或失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。
当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。
- 属性
Promise.length
长度属性,其值总是为 1 (构造器参数的数目).
Promise.prototype
表示 Promise 构造器的原型.
*/
let myFirstPromise = new Promise(function (resolve, reject) {
//当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
setTimeout(function () {
resolve("成功!"); //代码正常执行!
//reject("失败");
}, 250);
});
myFirstPromise.then(function (successMessage) {
//successMessage的值是上面调用resolve(...)方法传入的值.
//successMessage参数不一定非要是字符串类型,这里只是举个例子
console.log("Yay! " + successMessage);
});
//then->function(resolve)->function(yar) 调用顺序
function runAsync1() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务1执行完成');
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function runAsync2() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务2执行完成');
resolve('随便什么数据2');
}, 1000);
});
return p;
}
function runAsync3() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务3执行完成');
resolve('随便什么数据3');
}, 1000);
});
return p;
}
runAsync1()
.then(function (data) {
console.log(data);
return runAsync2();
})
.then(function (data) {
console.log(data);
return runAsync3(); //这里直接返回数据
})
.then(function (data) {
console.log(data);
});
//这里依次执行
接下来我们看看关于参数的传递
function getNumber() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
if (num <= 5) {
resolve(num);
}
else {
reject('数字太大了',num);
}
}, 2000);
});
return p;
}
getNumber().then(
function (data) {
console.log('resolved');
console.log(data);
},
function (reason, data) {
console.log('rejected');
console.log(reason);
console.log(data);
}
);
可以看到reject()对参数只能传递一个,并且调用了第二个函数。(reject 和 resolve 都是只能接受一个参数)
继续往下看
getNumber()
.then(function (data) {
console.log('resolved');
console.log(data);
//console.log(somedata); //此处的somedata未定义
})
.catch(function (reason) {
console.log('rejected');
console.log(reason);
});
在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法。
特性差不多了,接下来说一些方法
- all all会把所有的promise进行并行异步 所有的执行完才会回调then
- race race会把所有的promise进行并行异步 只有最先完成的才会回调then
function runAsync1() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务1执行完成');
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function runAsync2() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务2执行完成');
resolve('随便什么数据2');
}, 2000);
});
return p;
}
function runAsync3() {
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function () {
console.log('异步任务3执行完成');
resolve('随便什么数据3');
}, 3000);
});
return p;
}
Promise.all([runAsync1(), runAsync2(), runAsync3()]) //all会把所有的promise进行并行异步 所有的执行完才会回调then
.then(function (results) {
console.log(results);
});
结果
异步任务1执行完成
异步任务2执行完成
异步任务3执行完成
[ '随便什么数据1', '随便什么数据2', '随便什么数据3' ]
Promise
.race([runAsync1(), runAsync2(), runAsync3()]) //race会把所有的promise进行并行异步 只有最先完成的才会回调then
.then(function (results) {
console.log(results);
});
结果
异步任务1执行完成
随便什么数据1
异步任务2执行完成
异步任务3执行完成