promise相关理解 | 8月更文挑战

146 阅读3分钟

promise是什么

promise是异步编程的新方案

从语法上:promise是一个构造函数。

从功能上:promise封装了一个异步函数并可以返回其结果。

为什么会出现Promise

在JavaScript的世界中,所有代码都是单线程执行的。由于这个缺陷,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现。而Promise是异步编程的新方案

异步:将耗时很长的A工作交付给系统,然后就去执行B工作,等系统完成前面的工作,就通过回调函数继续完成A工作。AB工作的完成顺序,和交付他们的时间无关,所以叫异步。

纯回调函数和promise对比

指定回调函数的方式更加灵活,常规都是先指定回调

纯回调函数:

回调函数必须在启动异步前指定

createAudio(audioSetting, successCallback, failureCallback)//successCallback,failureCallback必须在启动异步任务之前指定
promise

可以在异步任务启动后才指定回调函数

setTimeout(() => {
    p.then(val=> {
        console.log(val)
    },reason => {
        console.log(reason)
    })
},3000)

回调地狱的的产生

一个回调函数里面需要上一层回调函数的结果作为参数。这是一种情况

promise支持链式调用,解决回调地狱便于阅读

function ajax(url,methods,data) {
    let xhr = new XMLHttpRequest()
    return new Promise(function(resolve, reject) {
        xhr.onreadystatechange = function () {
        if(xhr.readyState === 4) {
            if(xhr.status === 200) {
                return resolve(xhr.responseText)
            }else {
                return reject(xhr.status)
            }
        }
    }
    xhr.open('get', methods)
    xhr.send(data)
	})   
}
ajax('www.baidu.com','get').then((resolve => {
    //成功返回
    console.log(resolve)
}).catch(reject => {
    //错误返回
    console.log(reject)
})

函数对象

当我们把一个函数当对象使用时,他就是函数对象。 Fn.prototype\

错误

所有类型的父类型

Error

引用的变量不存在

ReferenceError

类型错误

TypeError

范围错误

RangeError

语法错误

SyntaxError

错误处理

捕获错误

try…catch

try {
    let b;
    console.log(b.xxx)
}catch(error) {
    console.log(error.message)
    console.log(error.stack)
}

抛出错误

throw

\

function D() {
    if(new Date % 2 === 1) {
        console.log(666)
    }else {
        throw new Error("当前时间为偶数")
    }
}
try {
    D()
}catch (e) {
    alert(e.message)
}

最基础的结构

// 1.创建一个Promise对象
let p = new Promise((resolve, rejected) => {
    setTimeout(() => {
        let d = Date.now()
        if(d % 2 === 0) {
            // 如果成功了执行,调用resolve函数
            resolve('d是偶数')
        } else {
            // 如果失败了执行,调用rejected函数
            rejected('d是基数')
        }
    },1000)
})
    p.then((val) => {
       console.log(val)
    }, reason => {
        console.log(reason)
    })

promise的异常传透

如果链式then调用,如果前面的then都没有指定回调,等于它们的rejected回调为

reason => {throw reason}
reason => Promise.rejected(reason)

中断promise链

在catch中返回一个状态为pending的Promise对象

.catch(() => {
	return new Promise(() => {})
})

方法

Promise.all([p1,p2,p3])

传入几个实例对象,若全部成功则返回全部返回的数据,若有一个失败则返回失败的rejected

Promise.race([p1,p2,p3])

传入几个实例对象,若都成功,则返回先完成的数据,若有一个失败则返回失败的rejected

p1.then(resolve, rejected)

不管是成功的回调还是失败的回调都是异步的

改变状态

抛出异常也可以改变状态为rejected

throw new Error()