1.购物历史清单那题(这题是因为平时Date对象用得少,不了解相关api)
————把日期转YYYY-MM-DD格式
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始
const day = String(date.getDate()).padStart(2, '0');
const formattedDate = `${year}-${month}-${day}`;
2.reduce一个函数数组(函数返回Promise对象或普通值)那题
————如何判断一个值是否为Promise实例(当时第一反应用这个来做个判断,但脑子短路忘记instanceof方法了。现在意识到无需做判断,只要统一转换成Promise即可)
myPromise instanceof Promise
————统一转换成Promise(后来看MDN才知道的一点:Promise.resolve()可以将嵌套的类Promise对象展平)
const myPromise = Promise.resolve(myValue)
//Promise.resolve()传入的参数是一个Promise对象,则返回这个 Promise 对象本身,且不会改变其状态;
//如果传入的参数不是Promise对象,则返回一个新的以传入参数为值的Promise对象,并且这个 Promise对象会变为 resolved(fulfilled)状态
所以最后大概写法是:
function task1(data){
return (data+'-->execute task1')
}
function task2(data){
return new Promise(reslove => resolve(data+'-->execute task2'))
}
function sequenceTasks(tasks, initialValue){
return tasks.reduce((total, curr_task) => total.then(res => Promise.resolve(curr_task(res))), Promise.resolve(initialValue))
}
sequenceTasks([task1, task2], 'task start')
.then(res => console.log('Final Result:', res))
.catch(err => console.error('Error:', err))
3.手写Promise.race那题
————判断是否为可迭代对象
function isIterable(obj) {
// 使用 typeof 检查是否为对象
if (typeof obj !== 'object' || obj === null) { return false; }
// 使用 in 操作符检查是否有 Symbol.iterator 属性
return Symbol.iterator in obj
}
————手写Promise.race
function myRace(tasks){
if(!isIterable(tasks)) throw new Error('请传入可迭代对象')
return new Promise((resolve, reject) => {
//forEach不会等待异步操作完成,所以可以使用
tasks.forEach((task) => {
if(task instanceof Promise){
task.then(res => return resolve(res), err => reject(res))
} else {
return resolve(task)
})
})
}