黄小明是老司机了,他每天任务就是送一群人去上班。但是每天送的人数不一样,这些人上车的时间也不一样。小明总是要等到人齐才能开车。
完成函数 driveCustomers,它接受不定数量的参数,这是参数都是函数,每个函数代表一个人。这些函数都接受一个回调函数作为参数,当回调函数被调用的时候说明这个人已经上车了,回调函数会被传入人名。例如:
const MissLi = (callback) => {
setTimeout(() => {
callback('MissLi')
}, 10) // 上车时间不一定
}
const MrWang = (callback) => {
setTimeout(() => {
callback('MrWang')
}, 3) // 上车时间不一定
}
// ..
driveCustomers(MissLi, MarWang, ...)
请你完成 driveCustomers 函数,它的作用是:当人都到齐以后,按上车的时间顺序把人名放到一个数组里面然后传给 drive 函数,正式开车。例如:drive(['MrWang', 'MissLi'])。
你只需要完成 driveCustomers 函数,drive 函数已经可以直接使用。
答案
这个题目我主要卡在对callback的处理上,这里callback(name)使用(name)=>{ resolve(r.push(name)) }
函数对其重新定义, 当setTimeout中的callback执行时,会把name值动态加载过来,在外部数组r中进行保存后然后返回,这样我们得到了一个关于fn的Promise链,当其在Promise.all执行完毕后,就得到了满足条件的r
const driveCustomers =async (...args) => {
let r=[]
let upArr = args.map(fn => {
return new Promise((resolve, rej) => {
fn((name)=>{
resolve(r.push(name))
})
});
});
await Promise.all(upArr)
return drive(r)
};