kongmingLatern / daily_plan

Record Your daily plan
1 stars 0 forks source link

2023-01-20 #16

Open kongmingLatern opened 1 year ago

kongmingLatern commented 1 year ago

2023-01-20

1. 你学习了哪些知识?

2. 学习过程中是否有存在的问题?

关于如何写每日任务:

如何写每日任务

kongmingLatern commented 1 year ago

今日学习总结

1. 生成器的提前结束

1.1 iterator.return

作用:

function* foo() {
    console.log('函数开始执行')
    try {
        yield "why"
    } catch(err) {
        console.log('内部错误', err)
    }
    yield 222

    console.log('函数结束执行')
}

1.3 自定义类的可迭代对象

yield* obj(可迭代对象)

数组

const arr = ["asd", "asbdf", "asgfdg"]

function* createArrayObject(arr) {
    yield* arr
}
const nameIterator = createArrayObject(arr)
console.log(nameIterator.next())
console.log(nameIterator.next())
console.log(nameIterator.next())

class Person {
    constructor(name, age, height, friends) {
        this.name = name
        this.age = age
        this.height = height
        this.friends = friends
    }
    *[Symbol.iterator]() {
        *yield this.friends
    }
}
const p = new Person('syj', 19, 190, ["ckh", "wjl", "fzh", "wl", "wdq"])
for(const item of p) {
    console.log(p) // ckh wjl fzh wl wdq
}

const pIterator = p[Symbol.iterator]()
console.log(pIterator.next())
console.log(pIterator.next())
console.log(pIterator.next())
console.log(pIterator.next())
console.log(pIterator.next())

1.4 生成器处理逻辑的封装优化

function exeGenFn(genFn) {
    const generator = genFn()

    function exec(res) {
        const result = generator.next()
        if(result.donw) return
        result.value.then(res => {
            exec(res)
        })
    }
    exec()
}
exeGenFn(getData)

2. 宏任务与微任务

事件循环中并非只维护着一个队列,事实上是有两个队列:

2.1 宏任务

console.log('script start')

function requestData(url) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log('setTimeout')
            resolve(url)
        }, 2000)
    })
}

function getData() {
    console.log('getData start')
    requestData("why").then(res => {
        console.log('then1-res': res)
    })
    console.log('getData end')
}

getData()
console.log('script end')

结果:

script start
getData start
getData end
script end
setTimeout
then1-res: why

2.4 面试题

async function async1() {
    console.log('async1 start')
    await async2()
    console.log('async1 end')
}

async function async2() {
    console.log('async2')
}

console.log('script start')

setTimeout(() => {
    console.log('setTimeout')
}, 0)

async1()

new Promise(function (resolve) {
    console.log('promise1')
    resolve()
}).then(function() {
    console.log('promise2')
})

console.log('script end')

答案:

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout