Вопросы для собеседования по обещанию серийного звонка

Promise

Недавно я увидел более интересный вопрос интервью:

Как выполнить Promise последовательно?

Вот простой ответ для вас. Для нескольких методов Promise, изначально предоставляемыхallа такжеraceметод. Однако ни один из них не выполняется серийно. Что должно, если выполняется последовательный метод? Вот два способа написания:

рекурсивное выполнение

Проще говоря, следующий асинхронный метод пропускается рекурсивно в следующем способе:then(next())

function iteratorPromise(arr){

	(function iter(){
		if(arr.length)
			arr.shift()().then(iter)
	})()
}

let arr = [()=>{
	return new Promise(res=>{
		console.log("run", Date.now());
		res()
	})
},()=>{
	return new Promise(res=>{
		console.log("run", Date.now());
		res()
	})
},()=>{
	return new Promise(res=>{
		console.log("run", Date.now());
		res()
	})
}]

iteratorPromise(arr);

// output
run 1529918098567
run 1529918098568
run 1529918098569

циклический вызов

Этот подход сложен и использует Promise.resolve() напрямую. Через задание цикла получите окончательный результат.

function iteratorPromise(arr){

	let res = Promise.resolve();

	arr.forEach(fn=>{
		res = res.then(()=>fn()) // 关键是 res=res.then... 这个逻辑
	})
}

let arr = [()=>{
	return new Promise(res=>{
		setTimeout(()=>{
			console.log("run", Date.now());
			res()
		},1000)
		
	})
},()=>{
	return new Promise(res=>{
		setTimeout(()=>{
			console.log("run", Date.now());
			res()
		},1000)
		
	})
},()=>{
	return new Promise(res=>{
		setTimeout(()=>{
			console.log("run", Date.now());
			res()
		},1000)
		
	})
}]

iteratorPromise(arr);


// output
run 1529918643573
run 1529918644574
run 1529918645580