最简单快速理解Promise与setTimeout

本文深入解析Promise的工作机制,包括resolve/reject的调用时机、微任务与宏任务的执行顺序,以及async/await的使用技巧。通过具体代码示例,帮助读者理解Promise的链式调用和异步执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise

MDN上的例子稍稍变化:

var p = new Promise(function(resolve, reject){
	setTimeout(function(){
		resolve("foo");
		console.log("first");
	}, 1000);
});

p.then(function(value){
	console.log(value);
});

需要理解几点:
1、定义Promise的时候在传递的函数内部调用resolve/reject,而真正执行的时刻是调用Promise.then()的时候;(我的理解是定义Promise的时候,同步执行new中的function,执行到resolve时状态由pending变为fulfilled,将回调函数放置到微任务队列中,执行完当前宏任务后,到微任务队列中执行,执行的是then中传递的函数,如果是reject则执行catch传入的函数 – 不知道理解对不对);
⚠️宏任务是JavaScript 引擎等待宿主环境分配的宏观任务;JS引擎自己发起的是微任务。

写不写resolve的区别,以及多次then:

var p = new Promise(function(resolve, relect){
	resolve();
});
p.then(function(){console.log("a");}).then(function(){console.log("b");});

对比

var p = new Promise(function(resolve, relect){
});
p.then(function(){console.log("a");}).then(function(){console.log("b");});

2、执行队列中微任务(如Promise)的执行先于宏任务(如setTimeout),微任务在本次循环尾部执行,宏任务在下次循环执行,看下面的例子:

function sleep(duration) {
    return new Promise(function(resolve, reject) {
        console.log("b");
        setTimeout(resolve,duration);
    })
}
console.log("a");
var s = sleep(2000);
setTimeout(function(){console.log("wait")},2000);
s.then(()=>console.log("c"));

相同秒数,c总在wait前打印;不同秒数时快的先打印

检验理解效果:
https://www.cnblogs.com/mengfangui/p/8670698.html(文中有两道题可以做一下)

⚠️在学习async/await时有一个问题,await等的是resolve执行完?(如果是setTimeout之类的,是不等待的,如果setTimeout中传入resolve会等待resolve执行完)

var oDiv = document.getElementsByTagName("div")[0];
function sleep(color, duration){
	return new Promise(function(resolve, reject){
		console.log(color);
		setTimeout(resolve,duration);
	}).then(function(){
		oDiv.className = color;
	})
}
async function lightOff(){
	while(true){
		await sleep("yellow", 3000);
		await sleep("red", 1000);
		await sleep("green", 2000);
	}
}
lightOff();

思考:一开始写错了,没有写return,resolve函数直接写在setTimeout里了,红绿灯的变化是一秒变色,且顺序不对,看似没有等待,为什么是这个结果还在思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值