笔试题之利用Promise改变异步函数的执行顺序

海康威视前端笔试题:

题目一:利用Promise改变异步函数的执行顺序,原代码如下所示,修改原代码,使得先输出“b”,再输出“a”

function a(){
    setTimeout(function(){
        console.log("a");
    }, 1000)
}
function b(){
    setTimeout(function(){
        console.log("b");
    }, 2000)
}
function test(){
    a();
    b();
}
test();

解析:

改写两个异步函数:

var a = function (){
	return new Promise(function(resolve,reject){
		setTimeout(function(){
			resolve();
			console.log("a");
		}, 1000)
	})
}
var b = function (){
	return new Promise(function(resolve,reject){
		setTimeout(function(){
			resolve();
			console.log("b");
		}, 2000)
	})
}

 方法一:使用then链式操作,

b().then(function(){
	return a();
})

方法二:构建队列,

//构建队列
function quene(arr){
	var seq = Promise.resolve();
	arr.forEach(function(item){
          seq = seq.then(item);
	})
	return seq;
}
//执行队列
quene([b, a]);

题目二:在题目一的基础上,下一个任务执行前必须先拿到上一个任务的执行结果才能执行,因此下一个任务需要传入一个参数接受上一个任务的执行结果,代码如下: 

解析:

改写两个异步函数:

var a = function (data){
	return new Promise(function(resolve,reject){
		setTimeout(function(){
			resolve(data + "a");
			console.log("a");
		}, 1000)
	})
}
var b = function (){
	return new Promise(function(resolve,reject){
		setTimeout(function(){
			resolve("b");
			console.log("b");
		}, 2000)
	})
}

 方法一:使用then链式操作,

b().then(function(data){
	return a(data);
}).then(function(data){
	console.log(data);
})

方法二:构建队列,

//构建队列
function quene(arr){
	var seq = Promise.resolve();
	arr.forEach(function(item){
		seq = seq.then(item);
	})
	return seq;
}
//执行队列
/*quene([b, a]);*/
quene([b, a]).then(data => {
	console.log(data);
});

你可能感兴趣的:(链式操作,队列,海康威视前端笔试题,前后端笔试题汇总)