按照顺序执行异步函数

应用 generator 函数,按照顺序依次执行异步方法,打开谷歌浏览器控制台查看结果
 
/**
* 按顺序依次执行异步
* @author 大花猫花大
* @date 2020-07-14
* @param {array} processes = [function, ...]
* @returns {promise}
*/
function processRun(processes = []) {

	return new Promise((resolve, reject) => {

		//将 processes 数据转成 Generator 函数
		function* gen(processes) {

			let n = 0;
			let result; //保留上一次 yield 的执行结果,传递给下一个 yield
			while (processes[n]) {
				result = yield new Promise((resolve, reject) => {
					processes[n](resolve, reject, result);
				});
				n++;
			};

			return;

		}

		function run(gen, data) {

			let next = gen.next(data);

			if (next.done) {
				resolve(next.value);
			} else {
				next.value.then(data => {
					run(gen, data)
				});
			}

		}

		run(gen(processes));

	});

}

//demo
processRun([

	function (resolve, reject, data) {
		setTimeout(() => {
			console.log('step1', data);
			resolve('step1返回值');
		}, 1000);
	},

	function (resolve, reject, data) {
		setTimeout(() => {
			console.log('step2', data);
			resolve(2);
		}, 2000);
	},

	function (resolve, reject, data) {
		setTimeout(() => {
			console.log('step3', data);
			resolve(3);
		}, 1000);
	}

]).then(res => {
	console.log('run over.');
})

执行结果

 

原文地址:https://www.cnblogs.com/aiv367/p/13299397.html