关于Promise .then()

本文探讨了JavaScript中Promise对象的链式调用特性,通过实验对比不同调用方式的结果,发现then方法的返回结果仅受首个Promise对象的影响,与后续Promise无关。深入理解Promise的执行机制对于编写异步代码至关重要。

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

var log = function(res) {
		console.log(res);
	}
var p1=new Promise(function (resolve,reject){
	var p1 = 1;
	if(p1==1) resolve("p1 resolve");
	else reject("p1 failed");
});
var p2=new Promise(function(resolve,reject){
	var p2=2;
	if(p2==2) resolve("p2 resolve");
	else reject("p2 reject");
});
var p3=new Promise(function(resolve,reject){
	var p3=3;
	if(p3==3) resolve("p3 resolve");
	else reject("p3 reject");
});
p1.then(
	function(res){
		log(res);
		p2.then(function(res){
			log(res);
			p3.then(function(res){
				log(res);
			});
		});
	});

结果:
p1 resolve
p2 resolve
p3 resolve

而当把连续的.then调用改为:
p1.then(p2).then(p3).then(function(res){log(res)});
后,结果为:
p1 resolve

由此可推断,then的结果,只由最外层第一个调用它的promise对象决定,与之后调用的其他promise对象无关
为了证实这一假设,实验如下:

p2.then(p3).then(p1).then(function(res){log(res)});的结果为:
p2 resolve

p3.then(p2).then(p1).then(function(res){log(res)});的结果为:
p3 resolve

JavaScript中`Promise.then()`和`setTimeout()`的执行顺序主要取决于事件循环(Event Loop)中宏任务(Macro Task)与微任务(Micro Task)的执行机制。`setTimeout()`属于宏任务,而`Promise.then()`属于微任务。 在JavaScript的事件循环中,每次循环会处理一个宏任务,并在宏任务执行完成后,清空所有已存在的微任务队列。这意味着,即使`setTimeout()`设置为0毫秒延迟,它仍然需要等待当前宏任务结束以及所有相关的微任务完成之后才会执行。 例如,当以下代码执行时: ```javascript console.log('script start'); let promise1 = new Promise(function (resolve) { console.log('promise1'); resolve(); console.log('promise1 end'); }).then(function () { console.log('promise2'); }); setTimeout(function(){ console.log('settimeout'); }); console.log('script end'); ``` 输出顺序为:`script start -> promise1 -> promise1 end -> script end -> promise2 -> settimeout`。这是因为创建`Promise`时传入的函数是同步执行的,而`.then()`中的回调函数会被放入微任务队列中[^2]。与此同时,`setTimeout()`的回调被安排为一个宏任务[^1]。 另一个例子展示了相同的原则: ```javascript let promise = Promise.resolve(1); console.log('同步1'); setTimeout(() => { console.log('宏任务:定时器'); }, 0); promise.then(() => { console.log('微任务:promise里的console'); setTimeout(() => { console.log('宏任务:promise里的定时器'); }, 0); }); console.log('同步2'); ``` 此代码片段的输出顺序是:`同步1 -> 同步2 -> 微任务:promise里的console -> 宏任务:定时器 -> 宏任务:promise里的定时器`。这表明了即使是在`Promise.then()`内部设置的`setTimeout()`,其回调也作为宏任务被推迟到下一个事件循环周期执行[^3]。 综上所述,在JavaScript中,`Promise.then()`的回调作为微任务会在当前宏任务结束后立即执行,而`setTimeout()`的回调作为宏任务必须等到当前宏任务完成以及所有微任务处理完毕后才能执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值