• Promise对象的使用


    Promise对象

    Promise是一个用于异步处理任务的对象, 可以将一个任务交给Promise对象, 该对象会异步执行这个任务,任务执行结束后。 可以通过这个promise对象的状态来判断该任务是否执行成功。并且,可以为这个对象设置成功和失败的回调函数,在回调时,它会携带成功的结果和失败的信息,作为这个回调函数的参数来执行回调。

    每一个promise对象有三个状态,等待(pending),成功(fullfilled)和失败(rejected),一旦变为成功或者失败后,它状态将不会再被改变。

    Promise对象实例化时时,参数为一个函数对象,该函数有两个参数,形参名分别为resolve和reject,在实例化完成后,内部函数将会被异步调用执行,调用时被注入两个函数对象作为实参(执行成功的回调函数和执行失败的回调函数),这两个函数分别被resolve和reject接受。所以,当我们调用resolve或者reject时,任务会结束,并分别返回成功和失败状态。

    // 创建一个Promise对象,该对象内部传入一个函数用于执行
    let myPromise = new Promise(
        function(resolve, reject){
        // 向函数中注入两个函数,resolve调用表示成功,reject调用表示失败。
        console.log('do sth----')
        resolve("successful")       // 调用表示执行成功
    })

    setTimeout(()=>console.log(myPromise), 1000) // 一秒后查看promise执行情况

    由于promise中调用的是 resolve("successful") ,所以返回的状态是成功,输出promise对象结果为 Promise { 'successful' } 如果调用 reject('error')将返回一个失败的状态,执行结果为Promise { <rejected> 'error' }

    Pomise对象的方法

    new = old.then(func(success), func(error)) 返回一个新的promise对象,old这个promise对象完成后,执行then方法,成功调用第一个函数并传入成功值,失败调用第二个函数并传入失败值,这个new的状态根据由两个函数决定,成功执行了则成功,执行失败了则失败
    new = old.catch(func(error)) old失败后,将会执行catch,然后尝试使用func(error)处理这个失败,成功处理了,new为成功,处理失败,则new为失败
    Promise.reject("msg") 该promise失败并返回失败信息
    Promise.resolve("msg") 返回成功和成功信息

    链式传递

    调用promise对象的then方法会返回一个新的promise对象并同样的异步执行。这样可以作为一个链式传递。

    let old = new Promise(
        (resolve, reject) => {
        // do something ... then
        resolve("this task is successful")
        // or reject('a error occured')
        }
    )
    
    let new = old.then(
        (value) => {console.log(value); return 123},
        (error) => {console.log(error); return 'error to success'}
    )
    
    let new2 = new.then(
        (value) => {Promise.reject("new error")}   // 成功时执行,但是返回一个错误
    ).catch(
        (error) => {return 'success'}   // 处理了这个失败
    )

    在上面的执行过程中,old对象调用了resolve代表着成功完成了任务,执行old.then()时会调用成功回调,第一个参数中的函数,并返回成功和成功值123,new对象的状态为成功,并携带成功值123,new对象继续执行new.then(),由于状态为成功所以执行第一个成功函数,但是在内部执行了Promise.reject(),则new2的状态为失败,并携带了失败值new error。返回临时的promise对象,这个对象执行了catch方法,捕捉这个失败并处理。最后返回 成功结果给new2对象,new成功,成功结果为success。

    old.then不管old成功和失败都将执行对应的处理函数,处理函数成功执行,返回新的对象就是成功的,处理函数失败,这个新的对象就将失败。新的对象可以继续执行then方法并指定回调函数,一直向下执行。

    old.catch只会在old为失败的时候执行,返回一个新的Promise,catch成功执行了解决了这个错误,新对象为成功,否则为失败。成功不会执行catch,这个新对象直接继承原来的promise状态信息。

  • 相关阅读:
    一些网购体会
    图灵社区 : 阅读 : [讨论] Java语言被很多人抱怨语法繁琐、开发效率低、体系繁杂而笨重,为什么还有这么强的生命力,尤其是在企业软件领域?
    反爬虫策略浅析
    redis源码笔记 刘浩de技术博客 博客园
    欢迎阅读 Erlang OTP 设计原理文档!¶
    图灵社区 : 阅读 : 十年码农聚会报道——让高龄老码农social起来
    学了一年的c++,连个像样的程序都写不出来 C/C++ / C++ 语言
    2012年第一批中关村高端领军人才公示公告
    为什么Markdown+R有较大概率成为科技写作主流? ← 阳志平的个人网站::技术
    大道至易——"刺秦与灭秦"个人、团队的前途与未来
  • 原文地址:https://www.cnblogs.com/k5210202/p/13311426.html
Copyright © 2020-2023  润新知