乐趣区

关于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 关键字前面的代码就属于异步工作。

退出移动版