关于javascript:异步编程

Javascript工作执行模式,分同步执行(synchronous)和异步执行(asyncchronous)。
异步编程计划的基本是回调函数(调用者定义,交给执行者执行的函数就是回调函数)

Js线程在某一刻发动了一个异步调用,代码持续向后执行其余工作,异步线程会独自执行异步工作,工作执行之后会将工作的回调放到音讯队列。Js主线程在实现所有工作过后,会顺次执行音讯队列中的工作。

Promise根本用法
用promise封装一个ajax办法

function ajax (url){
    return new Promise((resolve,reject)=>{
        let xhr = new XMLHttpRequest(); 
        xhr.open('GET',url); // 设置申请类型
        xhr.responseType = 'json'; //申请实现后拿到一个json对象
        xhr.onload = function() {
            if(this.status === 200){
                resolve(this.response)
            }else{
                reject(new Error(this.statusText))
            }
        }
        xhr.send()
    })
}

测试代码

ajax('本地文件').then((res)=>{
    console.log(res);
},(err)=>{
    console.log(err)
})

promise调用,防止进入回调天堂,借助于then办法,尽可能保障工作扁平化.
then办法返回一个全新的promise对象,每一个then办法都是为上一个then办法返回的promise对象去增加状态明确过后的回调。then办法会顺次执行,如果then办法返回的是一个一般值,将作为以后then办法返回的promise的值,下一个then办法参数就是,如果什么都不返回,就是undefinde

总结来说
promise对象的then办法返回一个全新的promise对象
前面的then办法就是在为上一个then返回的promise注册回调
后面then办法中回调函数的返回值会作为前面then办法回到的参数
如果回调中返回的是promise,那前面then办法的回调会期待他的完结

reject中会捕捉promise执行中呈现的失败或者异样,然而举荐应用catch捕捉,不要漏过任何一个异样

promise的静态方法
promise.resolve()
如果传入的是一个 Promise 对象,Promise.resolve 办法原样返回,如果传入的是一个值,值做返回值返回。
如果传入的是带有一个跟 Promise 一样的 then 办法的对象,相当于实现了一个thenable的接口
Promise.resolve 会将这个对象作为 Promise 执行

Promise.resolve({
  then: function (onFulfilled, onRejected) {
    onFulfilled('foo')
  }
})
.then(function (value) {
  console.log(value)
})

Promise.reject无论传入什么参数,都会作为这个 Promise 失败的理由

异步执行时序
这个问题波及到js事件循环,首先js事件分两种,宏工作和微工作
宏工作包含setTimeout,script,setInterval,
微工作包含promise中的then办法,node.js中的process.nextTick
离开理解他们的特点:
setTimeOut并不是间接的把你的回调函数放进上述的异步队列中去,而是在定时器的工夫到了之后,把回掉函数放到执行异步队列中去,它属于异步代码。队列有先进先出的特点,先排队的先执行,setTimeout执行须要满足两个条件

  1. 主过程必须是闲暇的状态,如果到工夫了,主过程不闲暇也不会执行你的回掉函数
  2. 这个回掉函数须要等到插入异步队列时后面的异步函数都执行完了,才会执行
    执行程序就是宏工作->微工作队列->宏工作队列

对于promise,async/await
1,pomise是同步工作,他的回调是异步工作
2,async关键字函数会返回一个promise对象,如果函数外面没有await关键字,那就相当于一个一般函数,await关键字前面的代码就属于异步工作。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理