js promise 异步编程 面试题解析

文章介绍了异步编程的概念,重点分析了Promise和setTimeout在处理异步操作时的不同。Promise用于更优雅地处理复杂的异步任务,有三种状态:Pending、Resolved和Rejected。而setTimeout是将函数放入主线程稍后执行。题目解析部分展示了Promise和setTimeout的执行顺序,帮助理解它们的工作机制。
摘要由CSDN通过智能技术生成

题目

let main = () => {
	console.log("A");
	setTimeout(() => {//setTimeout方法的 开始
		console.log("B");
			new Promise((resolve) => { //第一个promise异步 开始
				console.log("C");
				resolve();
			}).then(() => { // 第一个promise异步之后执行的then
				console.log("D");
			})
		console.log("E");
	});                 //setTimeout方法的 结束
	new Promise((resolve) => {//第二个promise异步 开始
		console.log("F");
		resolve();
	}).then(() => { //第二个promise异步的then
		console.log("G");
	})
	
	console.log("X");
}
main();
//请写出打印顺序
//答案:A F X     G B C E    D

1.什么是异步编程?

同步 按你的代码顺序执行,异步 不按照代码顺序执行。
Promise 是一个 ES6 提供的类,目的是更加优雅地书写复杂的异步任务。
Promise 对象,有三种状态:Pending(进行中)、Resolved(已完成)和 Rejected(已失败)。
Promise的参数为两个函数。
Promise 构造函数接受一个函数作为参数,该函数是同步的并且会被立即执行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject,分别表示 Promise 成功和失败的状态。

题目中resolve(data);,是为了将Promise异步状态改为Resolved已完成状态,之后就可以执行.then。
resolve(data)中的data是想then传递数据。

2.setTimeout(fn,time);

setTimeout也是回调函数的方法;
例如: setTimeout(print, 3000); //3秒后执行print方法。
setTimeout与Promise的区别:
Promise的回调函数书写时是竖着写回调函数,setTimeout是嵌套编写不利于后期维护。

3.解析题目

Promise构建后会立即执行(所以一般会将Promise用函数包裹将其return出去)。 例子在下方。setTimeout是根据参数时间放入到主线程中。

function print(delay, message) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log(message);
            resolve();
        }, delay);
    });
}

1)setTimeout会之后放到主线程中,所以主线程开始执行下面的代码,.then 也是回调函数,也是之后再执行

let main = () => {
	console.log("A");
	          //setTimeout方法的 结束
	new Promise((resolve) => {//第二个promise异步 开始
		console.log("F");
		resolve();
	})
	})
	
	console.log("X");
}
main();
//打印:A F X

2)因为第二个Promise在上一步已经构建执行,所以这次开始回调函数执行.then

.then(() => { //第二个promise异步的then
		console.log("G");
	})
//打印:A F X G

3)开始执行加在主线程后面的函数setTimeout

setTimeout(() => {//setTimeout方法的 开始
		console.log("B");
			new Promise((resolve) => { //第一个promise异步 开始
				console.log("C");
				resolve();
			})
		console.log("E");
	});    
	//打印:A F X G B C E 

4)Promise同步线程的执行完后,执行第一个Promise异步的回调函数.then

.then(() => { // 第一个promise异步之后执行的then
				console.log("D");
			})
			//打印:A F X G B C E D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值