Skip to content

文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises

一、认识

Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。

1、使用回调函数 完成Promise

javascript
function requestData(code, successCallback, failtureCallback){
    setTimeout(() =>{
        if(code === "你好"){
            console.log("成功")
            successCallback("成功的回调函数")
        }else {
            console.log("失败")
            failtureCallback("失败的回调函数")
        }
    },2000)
}

/**
 * 这个是使用的,那么上面的函数,必须给这通知一个结果
 * 基础的写法:传入成功和失败的回调函数
 */
requestData("你好", (res) => {
    console.log(res)
}, err => {
    console.error(err)
})

2、Promise的使用

一个 Promise 必然处于以下几种状态之一:

待定(pending): 初始状态,既没有被兑现,也没有被拒绝。

已兑现(fulfilled): 意味着操作成功完成。

已拒绝(rejected): 意味着操作失败。

注:① 他是ES6新增的;

​ ② Promise是一个类(是类就要 new 类名);

​ ③

javascript
function fun(){
    return new Promise((resolve, reject) => {
    
    })
}
const fn = fun()
// .then 方法传入成功的回调,会在Promise执行resolve函数时,被回调
fn.then(() => {

})
// .catch 方法传入失败的回调,会在Promise执行reject函数时,被回调
fn.catch(() => {

})
/**
 * Promise中传入的是一个 回调函数
 * 这个回调函数,传入之后,会立即执行
 * 传入的这个函数叫 executor
 * 这个回调函数,有两个参数:resolve, reject
 * 成功:resolve
 * 失败:reject
 */
const promise = new Promise((resolve, reject) => {
    console.log("Promise中传入的函数,立即执行")
})

基础使用:

javascript
function fun() {
    /**
     * resolve、reject中可以传入参数
     */
    return new Promise((resolve, reject) =>{
        fetch("https://mock.mengxuegu.com/mock/61922927f126df7bfd5b79ef/promise/promise3#!method=get").then(req => {
            return req.json()
        }).then(res => {
            resolve(res)
        }).catch(err => {
            reject(err)
        })
    })
}
const fn = fun()
fn.then(res => {
    console.log("成功", res)
}).catch(err => {
    console.log("失败", err)
})
// 上面的也可以传入两个函数(比如下面的写法)
fn.then(res => {
    console.log(res)
}, err =>{
    console.log(err)
})

3、resolve, reject的参数

1)普通的值或者对象

javascript
new Promise((resolve, reject) => {
    // resolve("resolve")
    resolve({name:"哈哈哈"})
}).then(res => {
    console.log(res) // {name:"哈哈哈"}
}, err => {
    console.error(err)
})

2)再传入一个Promise对象

如果当入的是一个Promise,那么当前Promise的状态,由传入的Promise决定;相当与当前的状态做了移交

javascript
const newPromise = new Promise((resolve, reject) => {
    resolve("传入的Promise")
})

new Promise((resolve, reject) => {
    resolve(newPromise)
}).then(res => {
    console.log(res) // 传入的Promise
}, err => {
    console.error(err)
})

3)传入一个对象(并且这个对象实现了thenable)传入一个对象,并且这个对象有实现 then 方法,那么也会执行该 then 方法,并且该 then 方法决定后续状态

javascript
new Promise((resolve, reject) => {
    const obj = {
        then: function (resolve, reject){
            // resolve("我是对象中的then方法")
            reject("我是对象中的then方法中 失败的回调")
        }
    }
    /**
     * 当你传入的是一个对象,并且这个对象里面有then方法,它到时候会自己执行
     * 这个对象中的then方法,会自动传递进来两个参数,分别为:resolve, reject
     * 这个时候,你就可以在对象的then方法中,去决定这个Promise的状态
     */
    resolve(obj)
}).then(res => {
    console.log(res)
}, err => {
    console.error(err)
})

基于 MIT 许可发布