根据阮一峰大神《ES6标准入门(第二版)》,有兴趣可以看一下~
Promise是异步编程的解决方案,比传统的解决方案-回调事件和函数-更合理和强大。
1、对象的状态不受外界影响。Promise对象代表一个异步的操作。有三种状态:Pending进行中,Resovled已完成,Rejected已失败。只有异步操作的结果可以决定当前的状态,任何其他操作都无法改变这个状态。额...这个原理就像是受精卵一样...
2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。状态改变的两种结果:pending→resolved,pending→rejected。状态凝固,并且不会再改变了。再添加回调函数仍旧是这个结果。事件的特点:如果错过,再去监听,得不到结果。
1、无法取消Promise,一旦新建立刻执行,无法中途取消。
2、如果不设置回调函数,内部抛出错误无法反应到外部。
3、当pending状态时,无法得知目前进展那一阶段。
一般,如果事件不断发生,stream模式比部署Promise更好。
var variable;
/**
*实例化promise对象
*
* @param {*} ms
* @returns
*/
function timeout(ms) {
return new Promise((resolve,reject)=>{
setTimeout(resolve,ms,'done');
});
}
timeout(100).then((value) => {
// 执行函数
variable=value;
console.log(value);
return variable;
});
console.log(variable);
Promise构造函数接受一个函数作为参数,resolve和reject,它们是js引擎提供的两个函数,不用自己部署。
resolve:将Promise对象的状态pending→resolve,在异步操作成功时将结果作为参数传出去,reject:是将pending→reject,在异步操作失败时,并并将报出的错误作为参数传出去。
例子:
promise.then((value)=>{
//success
},error=>{
//failure
});
then方法可以接受两个函数作为参数,第一个回调函数是promise对象的状态变为resolved是调用,第二个函数是在promise对象的状态变为reject时进行调用。
第二个函数是可选的,这两个函数都接受promise对象传出的值作为参数。
Promise的resolve函数参数除了正常的值外,还能是另一个promise的实例。表示异步结果有可能是一个值,也可能是一个异步的操作。
var p1 = new Promise(function (resolve, reject) {setTimeout(() =>reject(new Error('fail')), 3000);});
var p2 = new Promise(function (resolve, reject) {setTimeout(() =>resolve(p1), 1000);})
p2.then(result =>console.log(result)).catch(error =>console.log(error));
上面的代码,p1是一个promise,3秒后变为reject,p2的状态在1秒后改变,resolve方法是返回p1,由于p2返回的是另一个promise,所以then后面的语句,都是针对p1的,过了两秒之后,p1变为reject,导致触发catch方法指定的回调函数。
then方法里面有resolve和reject调用的函数,当第一个结束后,将数据进行return操作,可以将数据传给第二个then进行调用。
p2.then(result=>{
return result;
}).then(result=>{
var a=result;
})
该方法是.then(null,rejection)的别名,用于指定发生错误时回调的函数,
var promise = new Promise((resolve, reject) => {
resolve('ok');
throw new Error('test');
});
promise.then(value => console.log(value)).catch(error => console.log(error));
//处理promise对象和then的错误
then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
上面的代码抛出的错误在resolve之和,所以catch不会捕获到错误。
promise对象的错误具有冒泡的性质,会一直向后传递,直到捕获发生为止,也就是说catch放在最后,会捕获到前面的错误。
var someAsync = function () {
return new Promise((resolve, reject) => resolve(x + 2));
};
someAsync().then(() => {
return someAsyncThing();
}).catch(error => {
console.log(error);
y + 2;
}).then(() => console.log('carry on-------------')).catch(error => console.log(error));
此处catch中有错误,后面却没有catch进行捕获,所以会发生错误,这就需要进行再添加catch进行错误的捕获,否则catch后的then进不去,在catch中报错。
这个方法是接受一组数组作为参数的,但是参数之间的执行顺序不能明确的划分,只要有一个出现错误,就会将错误进行抛出,让reject进行执行。如果执行完成,需要参数全部只能成功才会进入到resolve。此处在项目中没有用到,就简略的提一下吧。
再后面就是异步操作和Asyn函数了,由于js是单线程的,所以异步编程对js语言来说太重要了,还没有进行深刻的认识,就不和大家瞎比比了。。。。