Promise-"承诺"

Promise-"承诺"

描述单个程序的执行状态:

同步:阻塞,当前程序要执行,必须等前面的程序执行完毕以后才能执行。

异步:非阻塞,当前程序的执行,和前面的程序是否执行完毕没有关系。

描述多个程序之间的运行关系:

并行:A,B,C可以同时运行。

串行:必须是A执行完毕,再去执行B,B执行完毕以后,再去执行C。

如何让异步程序进行串行。

启动延时器:

1、先去启动一个1秒延时器

2、当1秒定时器到了以后,启动一个2秒的延时器

3、当2秒定时器到了以后,启动一个3秒的延时器

console.log("启动一个1秒的延时器");
setTimeout(function(){
    console.log("1秒延时器到了");

    console.log("启动一个2秒的延时器");
    setTimeout(function(){
        console.log("2秒延时器到了");

        console.log("启动一个3秒的延时器");
        setTimeout(function(){
            console.log("3秒延时器到了");
        }, 5000);
    }, 3000);   
}, 4000);

上面这是我们传统的异步函数解决方式因为是异步 它不会按照我们所写的顺序执行,所以只能通过层层嵌套关系使异步程序按顺序执行,但是这样执行异步程序有两个缺点:1、回调地狱(嵌套太多层) 2、结构非常的紊乱

下面我们就来了解一下针对异步编程的解决方法Promise

Promise 是ES6对异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。Promise 简单说就是一个容器,里面保存着一个尚未完成且预计在未来完成的异步操作

Promise 是一个构造函数,用来创建一个Promise对象。

Promise对象代表一个异步操作,有两种种状态:

resolve(成功) reject(失败)

一旦状态改变,就不会再变,任何时候都可以得到这个结果。有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

下面我写一个简单的获取随机数验证成功还是失败的Promise验证操作并且两秒钟后出结果:

var p = new Promise(function(resolve,reject){//这里是同步
	setTimeout(function(){
		var num = Math.floor(Math.random()*15);
		if(num>7){
			resolve('成功');
		}else{
			reject('失败');
		}
	},2000);
}).then(function(msg){//创建Promise对象(then是异步)
	console.log(msg);//成功
},function(msg){
	console.log(msg)//失败
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。

resolve 和 reject 是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve 函数的作用是,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。

reject 函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例的then方法:第一个参数是resolved状态的回调函数第二个参数(可选)是rejected状态的回调函数方法返回的是一个新的Promise实例

【注】一个promise对象后面只能跟一个.then方法。

【注】超过两个异步程序串行的写法,如下代码:

function getPromise(msg,time){
	return new Promise(function(resolve,reject){
		setTimeout(function(){
			resolve(msg);
		},time);
	});
}
getPromise('执行1秒延时器',1000)
.then(function(msg){
	console.log(msg);
	return getPromise('执行2秒延时器',2000);
})
.then(function(msg){
	console.log(msg);
	return getPromise('执行3秒延时器',3000);
})
.then(function(msg){
	console.log(msg);
})

Promise实例的catch方法:用于指定发生错误时的回调函数,看如下代码:

var state = 0;
new Promise(function(resolve, reject){
    if(state == 1){
        resolve("代码执行成功1");
    }else{
        reject("代码执行失败1");
    }
}).catch(function(msg){
    console.log("catch," + msg);
})

Promise.all可以将多个Promise实例包装成一个新的Promise实例。1.它接受一个数组作为参数。2.数组可以是Promise对象,也可以是其它值,只有Promise会等待状态改变。3.当所有的子Promise都完成,该Promise完成,返回值是全部值的数组。4.如果有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果,以下是操作方法:

Promise.all([p1,p2,p3]).then(function (arr){
    console.log(arr);
},function (error){
    console.log(error);
});

最后祝大家都能轻松学好这项技术!逆战加油!中国加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值