promise用法

Promise用法

此篇文章主要参考大白话讲解Promise

一、基础用法

new Promise(function(resolve, reject) {
   //做一些异步操作
   setTimeout(function(){
     console.log('执行完成');
     resolve('随便什么数据');
   }, 2000);
});

在上面的代码中,首先执行了一个异步操作,也就是setTimeout,在2秒后输出“执行完成”,并且调用resolve方法。需要注意的是,在上面代码中,只是new了一个promise对象,并没有去调用而它就执行了,所以在使用promise的时候一般把它封装在一个函数里,然后去运行这个函数,代码如下:

function runAsync() {
	return new Promise(function(resolve, reject) {
		// 做一些异步操作
		setTimeout(function() {
			console.log('执行完成');
			resolve('随便什么数据');
		}, 2000)
	})
}
reunAsync();

二、基本用法

1、then

接上面代码,直接使用

renAsync().then(function(data) {
	console.log(data);
});

then接受一个参数,是函数,此函数也接收一个参数,是runAsync函数中resolve传的参。运行这段代码,会输出

执行完成
随便什么数据

then方法还有更骚气的用法,就是无限链式调用

function runAsync1() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log('异步任务1执行完成');
			resolve('随便什么数据1');
		}, 2000);
	});
}

function runAsync2() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log('异步任务2执行完成');
			resolve('随便什么数据2');
		}, 2000);
	});
}
function runAsync3() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log('异步任务3执行完成');
			resolve('随便什么数据3');
		}, 2000);
	});
}


runAsync1().then(data => {
	console.log(data);
	return runAsync2();
}).then(data =>  {
	console.log(data);
	return runAsync3();
}).then(data =>  {
	console.log(data);
})

输出

异步任务1执行完成
随便什么数据1
异步任务2执行完成
随便什么数据2
异步任务3执行完成
随便什么数据3

需要注意的是,then方法在链式调用时,then方法可以return一个promise对象,也可以return一个数据

runAsync1().then(data => {
	console.log(data);
	// return runAsync2();
	return '123';
}).then(data =>  {
	console.log(data);
	return runAsync3();
}).then(data =>  {
	console.log(data);
});

这样返回的数据就变成了

异步任务1执行完成
随便什么数据1
123
异步任务3执行完成
随便什么数据

如果不显式return数据的话,因为函数默认return undefined,所以下一个then方法接收到的参数就是undefined。 即上面结果中123的位置就是undefined,但是注意,then方法的链式调用依然会进行下去,不会被阻止
如果return的是promise对象的话,那这个promise对象必须resolve一个数据,否则,会终止链式调用,比如将上面的runAsync1函数做如下修改

function runAsync1() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log('异步任务1执行完成');
			return '123';
			// resolve('随便什么数据1');
		}, 2000);
	});
}

则返回数据只有一句

异步任务1执行完成

在上面的例子中,我们都是执行回调成功用resolve抛出数据,如果执行回调失败的话,我们就用reject抛出数据;

function getNumber() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			const num = Math.ceil(Math.random() * 10);
			if (num <= 5) {
				resolve(num);
			} else {
				reject('数字太大了');;
			}
		}, 2000)
	})
}

getNumber().then(
	data => {
		console.log('resolved:', data);
	},
	data => {
		console.log('reject:', data);
	}
)

输出为

resolved: 4

reject: 数字太大了

2、catch

catch用法和then的第二个参数一样,是指定reject的回调的,用法如下:

getNumber()
.then(function(data){
    console.log('resolved');
    console.log(data);
})
.catch(function(reason){
    console.log('rejected');
    console.log(reason);
});

其效果和写在then的第二个参数里面一样。不过它还有另一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,抛出异常的话,那么代码并不会报错卡死,而是会进入到这个catch方法中。

3、all

all方法接收一个数组作为参数,数组里面的值最终都返回后,才会进入then里面。代码如下

Promise.all([runAsync1(), runAsync2(), runAsync3()])
.then(res => {
	console.log(res);
});

返回值是:

异步任务1执行完成
异步任务2执行完成
异步任务3执行完成
(3) [“随便什么数据1”, “随便什么数据2”, “随便什么数据3”]

需要注意的是如果数组里的某个值得返回值是promise对象时,必须resolve数据,否则永远不会进入then方法中。

race

因为用到的比较少,所以不做介绍,如果有需要,请自行查询大白话讲解Promise

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise是一种异步编程的解决方案,它可以避免回调地狱,使得异步操作更加清晰和易于维护。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当Promise处于pending状态时,可以转换为fulfilled或rejected状态,一旦转换为其中一种状态,就不可再转换为其他状态。 Promise的基本用法如下: ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 if (/* 异步操作成功 */) { resolve(value); // 将Promise状态设置为fulfilled,并将异步操作的结果传递给回调函数 } else { reject(error); // 将Promise状态设置为rejected,并将错误信息传递给回调函数 } }); promise.then((value) => { // 异步操作成功时的回调函数 }, (error) => { // 异步操作失败时的回调函数 }); ``` 另外,Promise还提供了一些静态方法,如Promise.resolve和Promise.reject,可以方便地创建已经处于fulfilled或rejected状态的Promise对象,以及Promise.all和Promise.race等方法,可以处理多个Promise对象的状态。 下面是一个使用Promise的例子,通过异步加载图片并在加载完成后显示图片: ```javascript function loadImageAsync(url) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = function() { resolve(img); }; img.onerror = function() { reject(new Error('Could not load image at ' + url)); }; img.src = url; }); } loadImageAsync('https://example.com/image.jpg') .then((img) => { document.body.appendChild(img); }) .catch((error) => { console.error(error); }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值