塞壬的欢歌

导航

ES6 学习笔记 3 --- Promise

ES6(2015)

异步解决方案 Promise

ES5 回调 callback

function load (src,callback){
    let script = document.creatElement('script')
    script.src = src // 次操作 是 引擎默认的异步
    script.onload = () => { callback(src) }
    document.head.append(script)
}
load('./1.js',test)

function test(name){
    console.log(name)
}
test('tt')  // 先执行test() 后执行 load()

load('./1.js',function(st){
     load('./2.js',function(st){
         load('./3.js',test(st))
     })
}) // 嵌套回调 回调地狱

ES6 promise

function load(src){
    return new Promise((resolve,reject) =>{
        let script = document.creatElement('script')
    	script.src = src 
        script.onload = () => resolve(src)
        script.onerror = (err) => reject(err)
        document.head.append(script)
    })
}
load(./1.js)
    .then(()=>{return load(./2.js)},(err)=>{console.log(err)})
    .then(()=>{return load(./3.js)},(err)=>{console.log(err)})  // 平行调用

Promise 对象 基本原理

new Promise()  // 会有 pending 状态 挂起
resolve() // 会有 fulfilled 状态 
reject() // 会有 rejected 状态 状态互斥

多个异步调用,逐个调用 .then()

语法 : promise.then(onFulfilled,onRejected) 传入 两个函数

如果不是函数 将会是一个空的Promise对象.

// 期望 load 1 2 3 顺序执行, 一步报错 后续停止执行 
// 正规写法
load(./1.js)   //返回 新的 Promisee对象 调去then
    .then(()=>{return load(./2.js)},(err)=>{console.log(err)}) // 使用 load1 结果的 promise
    .then(()=>{return load(./3.js)},(err)=>{console.log(err)}) // 使用 loda2 结果的 promise
// 不正规 但可执行  
load(./1.js) 
    .then(load(./2.js)) // 使用 laod1 结果的 promise
    .then(load(./2.js))  // 使用 空的promise ,因为 上次调用不符合 语法规定
// 不正规 但可执行
load(./1.js)   
    .then(()=>{load(./2.js)},(err)=>{console.log(err)}) // 使用 load1 结果的 promise
    .then(()=>{load(./3.js)},(err)=>{console.log(err)}) // 使用 空的promise ,因为,上次then没有返回任何值 
// 后2种 一旦 load2 报错. load3 还会执行. 是错误的结果.
// 第1中 一旦 load2 报错. 将会阻断 laod3 的执行 . 是期望的结果.

返回值不是异步请求,而是同步的结果 .resolve() .reject()

语法: Promise.resolve(value) Promise.reject(new Error())

注意 是 静态方法 Promise类直接调用的 类方法

function test(key){
    if(key){
        return new Promise((resolve,reject)=>{
            resolve(30)
        })
    } else if(key ===2){
        // retrun 42 会使 调用链断掉, 所以 使用 静态方法 resolve 处理正常信息使其继续调用下个then
        return new Promise.resolve(42)
    }else {
        // retrun new Error  会使 调用链断掉.所以 使用一个 静态方法 reject 来处理错误 阻断下次调用
        return new Promise.reject(new Error('sssss'))
    }
}
test(0).then((value) =>{console.log(value)},(err) => {console.log(err)})

捕获错误,并统一处理 .catch()

load(./1.js)
    .then(()=>{ return load(./2.js)}) // 第二个 reject 函数没有写
 	.then(()=>{ return load(./3.js)})
	.catch(err => console.log(err))  // 避免每次都写 reject 方法

并行异步调用:最后一个调用结束再执行.all()

const p1 = load(./1.js)
const p2 = load(./2.js)
const p3 = load(./3.js)
// 3个异步 不论调用快慢 最后全掉用完 就会执行
Promise.all([p1,p2,p3]).then(value =>{console.log(value)}) 

竞争异步调用:第一个调用结束就执行.race()

const p1 = load(./1.js)
const p2 = load(./2.js)
const p3 = load(./3.js)
// 3个异步 只执行 最快的那个
Promise.race([p1,p2,p3]).then(value =>{console.log(value)}) 

posted on 2020-04-05 23:22  塞壬无欢歌  阅读(183)  评论(0编辑  收藏  举报