博客
关于我
Promise的api使用方法
阅读量:284 次
发布时间:2019-03-01

本文共 3542 字,大约阅读时间需要 11 分钟。

Promise构造函数是JavaScript中处理异步操作的一种强大工具,它允许我们在代码中明确地表示关于未来操作的状态。以下是对Promise及其相关方法的详细解析:

Promise构造函数

Promise 构造函数用于创建一个新的 Promise 对象。Promise 的核心是一个执行器函数(executor),它接收两个函数:resolverejectresolve 会在异步操作成功时被调用,reject 会在异步操作失败时被调用。这些函数的作用是将 Promise 的状态从 pending(未定)变为 fulfilled(完成)或 rejected(失败)。

构造一个 Promise 实例的代码示例:

new Promise((resolve, reject) => {  // 异步操作执行逻辑  resolve('成功的数据');  // 或者  // reject(new Error('失败的数据'));});

resolvereject 函数会根据异步操作的结果分别将 Promise 的状态改为 fulfilledrejected。需要注意的是,执行器函数在 Promise 构造时会立即执行,且 resolvereject 的返回值会被忽略。

Promise.prototype.then()

then() 方法用于将当前 Promise 的结果传递给一个回调函数。它返回一个新的 Promise,并且可以传入两个参数:成功回调和失败回调。

例如:

var p1 = new Promise((resolve, reject) => {  resolve('成功!');  // 或者 reject(new Error('出错了!'));});p1.then(value => {  console.log(value); // '成功!'}, reason => {  console.error(reason); // '出错了!'});

then() 方法返回的 Promise 的状态取决于传入的回调函数的返回值:

  • 如果回调函数返回一个值,新的 Promise 成功,值作为参数传递。
  • 如果没有返回值,参数为 undefined
  • 如果抛出错误,新的 Promise 失败,错误作为参数传递。
  • 如果返回另一个 Promise,新的 Promise 的状态与该 Promise 的状态相同。

Promise.prototype.catch()

catch() 方法用于处理 Promise 失败的情况。它等价于调用 then(undefined, onRejected),将失败原因传递给回调函数。

例如:

var p1 = new Promise((resolve, reject) => {  resolve('Success');});p1.then(value => {  console.log(value); // 'Success'  throw 'oh, no!';}).catch(e => {  console.log(e); // 'oh, no!'});

catch() 无法捕获在异步操作中抛出的错误,特别是如果在 resolve() 之后抛出错误,catch() 也无法处理。

Promise.prototype.resolve()

resolve() 方法用于将一个值或另一个 Promise 转换为成功状态的 Promise。它会等待传入的 Promise 完成,并将结果传递给回调函数。

例如:

Promise.resolve('Success').then(value => {  console.log(value); // 'Success'});Promise.resolve([1, 2, 3]).then(v => {  console.log(v[0]); // 1});

resolve() 也会将数组或其他数据结构传递给回调函数。

Promise.prototype.reject()

reject() 方法用于创建一个失败状态的 Promise,传入的原因会在 catch() 中被捕获。

例如:

Promise.reject('Testing static reject').then(value => {}, reason => {  console.log(reason); // 'Testing static reject'});

Promise.prototype.all()

all() 方法用于同时处理多个 Promise。它返回一个新的 Promise,只有当所有传入的 Promise 都成功时,新的 Promise 才成功;否则,新的 Promise 失败。

例如:

var p1 = Promise.resolve(3);var p2 = 1337;var p3 = new Promise(resolve => {  setTimeout(resolve, 100, 'foo');});Promise.all([p1, p2, p3]).then(values => {  console.log(values); // [3, 1337, 'foo']});

如果其中一个 Promise 失败,新的 Promise 也会失败。

Promise.prototype.race()

race() 方法返回一个 Promise,一旦迭代器中的某个 Promise 解决或拒绝,返回的 Promise 就会以该结果作为最终结果。

例如:

var promise1 = new Promise(resolve => {  setTimeout(resolve, 500, 'one');});var promise2 = new Promise(resolve => {  setTimeout(resolve, 100, 'two');});Promise.race([promise1, promise2]).then(value => {  console.log(value); // 'two'(因为 `promise2` 更快)});

Promise在Ajax操作中的应用

Promise 被广泛用于处理 Ajax 请求。通过创建一个 Promise,我们可以等待请求完成,并在成功或失败时分别处理结果。

例如:

const getJSON = function(url) {  const promise = new Promise((resolve, reject) => {    const handler = function() {      if (this.readyState !== 4) {        return;      }      if (this.status === 200) {        resolve(this.response);      } else {        reject(new Error(this.statusText));      }    };    const client = new XMLHttpRequest();    client.open('GET', url);    client.onreadystatechange = handler;    client.responseType = 'json';    client.setRequestHeader('Accept', 'application/json');    client.send();  });  return promise;};getJSON('/posts.json').then(json => {  console.log('Contents: ' + json);}, error => {  console.error('出错了', error);});

通过 Promise,我们可以简化 Ajax 请求的回调处理,使代码更加简洁和易读。

总结

Promise 构造函数及其方法为JavaScript代码带来了异步操作的处理,简化了回调地狱问题,使代码更加简洁易读。通过合理使用 then(), catch(), resolve(), reject(), all(), race() 等方法,我们可以高效地处理异步操作,提升代码的质量和可维护性。

转载地址:http://zhko.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>