美文网首页
小白的理解JS中的promise

小白的理解JS中的promise

作者: 都江堰古巨基 | 来源:发表于2018-12-12 16:55 被阅读0次

Promise是ES6中所独有的对象,它很抽象,多用于异步js代码中,如:async函数与await一起使用,
一个promise可以处于3种状态中的一种:
pending —— 进行状态
resolve —— 成功状态
rejects —— 失败状态
一个标准的promise对象的格式如下:

new Promise((resolve,rejects) => {
    const n = Math.round(Math.random()*10)
    if (n>5){
        resolve("success !")
    } else {
        rejects("fail !")
    }
})

但我们通常要在外部调用promise对象,如果直接写一个赋值操作,就不方便操作这个promise对象了,如下:

const test = new Promise((resolve,rejects) => {
    const n = Math.round(Math.random()*10)
    if (n>5){
        resolve("success !")
    } else {
        rejects("fail !")
    }
})
// 调用
await test()
// 输出
success !
// 后续调用
await test()
await test()
// 输出
success !
success !

test只会被赋值一次,只有一个具体的值
所以为了灵活的调用promise对象,我们要将其写成函数形式:

const test = () =>{
    return new Promise((resolve,rejects) => {
        const n = Math.round(Math.random()*10)
        if (n>5){
            resolve("success !")
        } else {
            rejects("fail !")
        }
    })
} 
// 调用:
await test()
// 输出:
success !
// 后续调用
await test()
await test()
// 输出:
fail !
success !

那么问题来了,如果resolve之后,后续的代码会不会继续执行呢?答案是会

const test = () =>{
    return new Promise((resolve,rejects) => {
        const n = Math.round(Math.random()*10)
        if (n>5){
            resolve("success !")
        } else {
            rejects("fail !")
        }
        console.log("resolve之后并没有停止运行")
    })
} 

await test()
// 输出
success !
resolve之后并没有停止运行

为了让代码在resolve之后就返回结果不继续执行,我们需要return一下

const test = () =>{
    return new Promise((resolve,rejects) => {
        const n = Math.round(Math.random()*10)
        if (n>5){
            resolve("success !")
            return "";
        } else {
            rejects("fail !")
            return "";
        }
        console.log("resolve之后并没有停止运行")
    })
} 

await test()
// 输出
success !

promise对象中resolve的值最后会在后续的then中使用:

const test = () =>{
    return new Promise((resolve,rejects) => {
        const n = Math.round(Math.random()*10)
        if (n>5){
            resolve("success !")
            return "";
        } else {
            rejects("fail !")
            return "";
        }
        console.log("resolve之后并没有停止运行")
    })
} 

await test().then(r => {
    console.log(`then ${r}`)
})

// 输出
then success !

promise.race()

当有多个promise的时候,可能我们只需要其中一个返回结果就行了。如下:

const a = new Promise((resolve,reject) => {
    setTimeout(() => {
        console.log("我是兔子")
        resolve(500)
    },1000)
})

const b = new Promise((resolve,reject) => {
    setTimeout(() => {
        console.log("我是乌龟")
        resolve(100)
    },2000)
})

Promise.race([a,b]).then(v => {
    console.log(v)
})

// 输出:
我是兔子
500
我是乌龟

注意:race()中传入的类型应该是promise类型!

关于多个不同时间的函数执行

比如一个函数3秒执行完毕,一个函数5秒执行完毕,一个函数10秒执行完毕。现在我们只想要3秒结束的结果。
有两种写法可以获取到:

// 第一种:
const a2 = new Promise((resolve,reject) => {
    setTimeout(() => {
        console.log("我是兔子")
        resolve(500)
    },3000)
})

const b2 = new Promise((resolve,reject) => {
    setTimeout(() => {
        console.log("我是乌龟")
        resolve(100)
    },5000)
})

var result = await Promise.race([a2,b2])

// 第二种:
const a = () => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            console.log("我是乌龟")
            resolve(100)
        },5000)

        setTimeout(() => {
            console.log("我是兔子")
            resolve(500)
        },1000)
    })
}

result = await a()

相关文章

  • 小白的理解JS中的promise

    Promise是ES6中所独有的对象,它很抽象,多用于异步js代码中,如:async函数与await一起使用,一个...

  • Promise原理解析

    Promise原理解析 标签(空格分隔): Node.js Promise原理解析 简介 Promise 对象用于...

  • Promise - 04 Promise 的理解和使用

    Promise 的理解和使用 1: Promise 是什么? 抽象表达Promise 是 JS 中进行异步编程的新...

  • 八(1)、Promise(周) ------ 2020-02-2

    1、什么是Promise: 2、通过原生JS实现简单的Promise原理,理解Promise如何管控异步编程: 3...

  • Promise的理解和使用

    Promise是什么? 理解 1. 抽象表达 Promise是一门新的技术(ES6规范) Promise是JS中进...

  • ES6 promise理解

    一、promise 是什么 1、Promise 是 JS 中解决异步编程的一种方案。 拓展:js中解决异步编程的...

  • js-Promise基础

    js-Promise基础(第三周) Promise含义 promise意思为允诺、许诺、承诺在js中为了解决编写代...

  • js:Promise的简单理解

    层面上的理解:Promise是一个类,有3个状态分别是:等待态(默认) 成功态 失败态 打个比方比如承诺要给...

  • js 中的Promise

    特点 1.对象的状态不受外界影响。2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。3.无法取消Promi...

  • js中的promise

    Promise 是 JavaScript 语言提供的一种标准化的异步管理方式,它的总体思想是,需要进行的IO,等待...

网友评论

      本文标题:小白的理解JS中的promise

      本文链接:https://www.haomeiwen.com/subject/ihnuhqtx.html