海康威视前端笔试题:
题目一:利用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);
});