笔试题之利用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);
});

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值