Promise的介绍及基本用法是什么

技术Promise的介绍及基本用法是什么这期内容当中小编将会给大家带来有关Promise的介绍及基本用法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Promise是ES6引入的

本期,边肖将为您带来Promise及其基本用法的介绍。文章内容丰富,从专业角度进行分析和叙述。看完这篇文章,希望你能有所收获。

Promise是ES6引入的异步编程的新解决方案。语法承诺是一个构造函数,

用于封装异步操作并获取成功或失败的结果。

承诺构造函数:承诺(执行元){}

Promise.prototype .然后方法

Promise .原型. catch方法

00-1010实例化Promise。

NewPromise()在实例化时接受一个参数,它是一个函数。

这个函数有两个形式参数,解析和拒绝。

varpromise=newPromise((解析,拒绝)=}

//用于处理异步操作。

})我们在这里使用计时器来模拟异步操作。

承诺有三种状态:进行中、成功和失败。

varpromise=newPromise((解析,拒绝)=}

//这是异步操作。

setTimeout(()={ 0

//在这里通过模拟得到数据。

Vardata=“获取的数据”

//得到数据后,我们可以调用resolve和reject方法来改变promise对象的状态。

Resolve(数据)//resolve可以将承诺对象的状态更改为成功,reject()可以将承诺对象的状态更改为失败。

},1000);

})

Promise的基本使用

当承诺对象的状态为成功或失败时,则可以调用方法。

然后方法接受两个参数,这两个参数都是函数类型的值。

当promise对象的状态为成功时,调用then方法的第一个参数。

也就是说,当promise对象的状态为失败时,将调用then方法的第二个参数。

第二个参数是可选的,如果不需要捕获故障,可以省略。

参数分别有一个形式参数,成功的函数称为value,失败的为err。

promise . then(value={ 0

//异步函数中调用resolve(data)时,表示promise对象的状态为成功,则调用then方法的第一个参数。

console.log(值);//“hello world”值是resolve()方法传递的数据。

},err={

//异步函数中调用reject(data)时,表示promise对象的状态为failed,则调用then方法的第二个参数。

console . log(err);//err是reject()方法传递的数据。

})调用then方法then方法的返回结果是Promise对象,对象的状态由回调函数的执行结果决定。

如果回调函数中返回的结果是非承诺类型的属性,则状态为成功,返回值为对象的成功值。

letdata=promise .然后((val)={ 0

//console . log(val . result);

//返回

回非Promise的情况
    // return val.result
 
    // 返回Promise的情况
    return new Promise( (resolve, reject) => {
        // resolve('ok')
        reject('err')
    })
}, err => {
console.log(err);
})
// 返回非Promise的情况 状态为成功,返回值为对象的成功的值 
// 返回结果是Promise 对象,对象状态由回调函数的执行结果决定
// 抛出错误,状态为失败
console.log(data);

所以then可以链式调用使用方法可参见下面promise应用示例。

promise的catch方法

promise的catch方法是then(null, rejection)的别名,用于指定发生错误时的回调

Promise对象的状态为resolve,就会调用then方法的指定回调函数

const promise = new Promise((resolve, reject) => {
    resolve('ok')
})
promise.then(val => {
    console.log(val);  // ok
}).catch(err => {
    console.log(err);
})

如果promise的状态为rejected就会调用catch方法的回调函数来处理这个问题。

const promise = new Promise((resolve, reject) => {
    reject('err')
})
promise.then(val => {
    console.log(val);
}).catch(err => {
    console.log(err);  // err
})

如果then方法在运行中出现错误也会被catch方法捕获

const promise = new Promise((resolve, reject) => {
    resolve('err')
})
promise.then(val => {
    console.log('ok');    // ok
    throw '出错了!!'     // then里面抛出的错误会继续被catch捕获
}).catch(err => {
    console.log(err);  // 出错了!!
})

promise对象的错误具有冒泡的性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch捕获。

const promise = new Promise((resolve, reject) => {
    resolve('ok')
})
promise.then(val => {
    return new Promise((resolve, reject) => {
        reject('err')
    })
})
.then(val => {
    return new Promise((resolve, reject) => {
        reject('err')
    })
})
.catch(err => {
    // 以上产生的错误都可以被catch捕获到
    console.log(err);  // err
})

一般来说,不要在then方法中定义rejected状态回调函数(即then的第二个参数),而应总是使用catch方法。

promise应用 

promise读取文件,多个文件连续调用

在这个例子中我们用到了Node.js的文件模块

// 读取文件信息
const fs = require('fs')

在下面代码中我们使用了promise包装了异步函数

我们先来看看正常的文件读取操作

// 读取文件信息
const fs = require('fs')
 
// 如果读取失败err就是一个错误对象,读取成功data就是数据
fs.readFile('./01.txt', (err, data) => {
    // 判断是否出现错误,如果读取错误就打印错误对象。
    if (err) {
        console.log(err);
        return
    }
    console.log(data.toString());
})

我们如果想在读取成功之后继续读取文件,就需要在回调函数中继续使用fs.readFile...去读取文件,嵌套层次一多,这样一来就会形成回调地狱。 

接下来我们使用Promise的方式来读取文件

// 读取文件信息
const fs = require('fs')
 
const promise = new Promise((resolve, reject) => {
    fs.readFile('./01.txt', (err, data) => {
        if (err) return reject(err)
        resolve(data)
    })
})
 
promise.then(val => {
    console.log(val.toString());
    // 返回一个Promise对象
    return new Promise((resolve, reject) => {
        fs.readFile('./02.txt', (err, data) => {
            if (err) return reject(err)
            resolve(data)
        })
    })
}, err => {
    console.log(err);
})
// 上一个then里面返回的是一个promise对象,我们可以继续.then
.then(val => {
    console.log(val.toString());
    return new Promise((resolve, reject) => {
        fs.readFile('./03.txt', (err, data) => {
            if (err) return reject(err)
            resolve(data)
        })
    })
}, err => {
    console.log(err);
})
.then(val => {
    console.log(val.toString());
}, err => {
    console.log(err);
})

promise封装ajax请求

封装了ajax请求,使用then获取结果,让代码看起来更加简洁,解决了回调地狱的问题

const promise = new Promise((resolve, reject) => {
    // 创建对象
    const xhr = new XMLHttpRequest()
    // 初始化
    xhr.open("GET", 'https://api.apiopen.top/getSongPoetry?page=1&count=20')
    // 发送
    xhr.send()
    // 绑定事件处理响应结果
    xhr.onreadystatechange = function () {
        // 判断
        // 进入最后一个阶段,所有的响应体都回来了
        if (xhr.readyState === 4) {
            // 判断响应码
            if (xhr.status >= 200 && xhr.status < 300) {
                // 表示成功
                // console.log(JSON.parse(xhr.response));
                resolve(JSON.parse(xhr.response))
            } else {
                reject(xhr.status)
            }
        }
    }
})
// 指定回调
promise.then((val) => {
    console.log(val);
}, err => {
    console.log(err);
})

上述就是小编为大家分享的Promise的介绍及基本用法是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/41723.html

(0)

相关推荐

  • 苹果手机如何删除通讯录联系人,苹果id怎么删除电话号码

    技术苹果手机如何删除通讯录联系人,苹果id怎么删除电话号码苹果手机删除电话号方法苹果手机如何删除通讯录联系人: 以iPhone8手机为例,删除“联系人”(电话号码)有如下操作: 一、在手机桌面打开“电话”。
    二、打开“

    生活 2021年10月22日
  • 自制柚子茶,家庭自制蜂蜜柚子茶要怎么做

    技术自制柚子茶,家庭自制蜂蜜柚子茶要怎么做在冬天这个时候,是吃柚子的最佳时节,柚子皮具有很好的清热去火功能,并且柚子皮在擦拭水龙头等厨具上面还可以很好的清洁污渍,所以小编的柚子皮都是充分利用的,最喜欢的就是用它来做蜂蜜柚

    生活 2021年10月28日
  • 如何理解SaaS软件的技术缺陷以及解决方法

    技术如何理解SaaS软件的技术缺陷以及解决方法今天就跟大家聊聊有关如何理解SaaS软件的技术缺陷以及解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

    攻略 2021年10月29日
  • 怎么使用awk语言编写脚本

    技术怎么使用awk语言编写脚本这篇文章将为大家详细讲解有关怎么使用awk语言编写脚本,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。和写 shell 脚本差不多,awk 脚本以下面这一行

    攻略 2021年10月26日
  • Fixed Table统计信息

    技术Fixed Table统计信息 Fixed Table统计信息Fixed Table统计信息
    2 YEARS AGOORACLEOracle有大量的内部视图供DBA使用,这些视图底层表以X$开头,F

    礼包 2021年11月19日
  • 怎么理解PHP7.2忽略父类方法以及Liskov替换原则相关问题

    技术怎么理解PHP7.2忽略父类方法以及Liskov替换原则相关问题这篇文章主要介绍“怎么理解PHP7.2忽略父类方法以及Liskov替换原则相关问题”,在日常操作中,相信很多人在怎么理解PHP7.2忽略父类方法以及Li

    攻略 2021年11月16日