zoukankan      html  css  js  c++  java
  • 异步

    异步

    相关知识点

    单线程和异步

    • js是单线程语言,只能同时做一件事

    • 浏览器和 nodejs 已支持 js 启动进程,如Web Worker

    • js 和 DOM 渲染共用同一个线程,因为 js 可修改DOM结构

    • 遇到等待(网络请求,定时任务)不能卡住,所以需要异步

    • 异步是基于callback 函数形式调用的

    应用场景

    • 网络请求,如果ajax图片加载

    • 定时任务,如 setTimeout

    //ajax
    console.log('seart')
    $.get('./data.json',function(data){
        console.log(data)
    })
    console.log('end')
    // 图片加载
    console.log('start')
    let img = document.createElement('img')
    img.onload = function(){
        console.log('loaded')
    }
    img.src = './xxx.png'
    console.log('end')

    题目

    1.同步和异步的区别是什么?

    • 异步是基于JS单线程

    • 异步不会阻塞代码执行

    • 同步会阻塞代码执行

    2.手写Promise加载一张图片

     

    function loadImg(src) {
        const p = new Promise(
            (resolve, reject) => {
                const img = document.createElement('img')
                img.onload = () => {
                    resolve(img)
                }
                img.onerror = () => {
                    const err = new Error(`图片加载失败 ${src}`)
                    reject(err)
                }
                img.src = src
            }
        )
        return p
    }
    ​
    // const url = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg'
    // loadImg(url).then(img => {
    //     console.log(img.width)
    //     return img
    // }).then(img => {
    //     console.log(img.height)
    // }).catch(ex => console.error(ex))
    ​
    const url1 = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg'
    const url2 = 'https://img3.mukewang.com/5a9fc8070001a82402060220-100-100.jpg'
    ​
    loadImg(url1).then(img1 => {
        console.log(img1.width)
        return img1 // 普通对象
    }).then(img1 => {
        console.log(img1.height)
        return loadImg(url2) // promise 实例
    }).then(img2 => {
        console.log(img2.width)
        return img2
    }).then(img2 => {
        console.log(img2.height)
    }).catch(ex => console.error(ex))
  • 相关阅读:
    <数据结构基础学习>(四)链表 Part 1
    <Android基础>(四) Fragment Part 1
    <Android基础>(三) UI开发 Part 3 RecyclerView
    <数据结构基础学习>(三)Part 2 队列
    <数据结构基础学习>(三)Part 1 栈
    <数据结构基础学习>(二)简单的时间复杂度分析
    <Android基础>(三) UI开发 Part 2 ListView
    <Android基础>(三) UI开发 Part 1
    <数据结构基础学习>(一)数组
    <Android基础>(二) Activity Part 2
  • 原文地址:https://www.cnblogs.com/manhuai/p/14305711.html
Copyright © 2011-2022 走看看