当前位置: 首页 > article >正文

Promise链式调用

Promise是一个对象,它代表了一个异步操作的最终完成或者失败

Promise 对象的状态

Promise 对象通过自身的状态,来控制异步操作。Promise 实例具有三种状态。

  • 异步操作未完成(pending)
  • 异步操作成功(fulfilled)
  • 异步操作失败(rejected)

上面三种状态里面,fulfilledrejected合在一起称为resolved(已定型)。

这三种的状态的变化途径只有两种。

  • 从“未完成”到“成功”
  • 从“未完成”到“失败”

一旦状态发生变化,就凝固了,不会再有新的状态变化。这也是 Promise 这个名字的由来,它的英语意思是“承诺”,一旦承诺成效,就不得再改变了。这也意味着,Promise 实例的状态变化只可能发生一次。

因此,Promise 的最终结果只有两种。

  • 异步操作成功,Promise 实例传回一个值(value),状态变为fulfilled
  • 异步操作失败,Promise 实例抛出一个错误(error),状态变为rejected

链式调用

连续执行两个或者多个异步操作是一个常见的需求,在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。我们可以通过创造一个 Promise 链来实现这种需求。见证奇迹的时刻:then() 函数会返回一个和原来不同的新的 Promise

在过去,要想做多重的异步操作,会导致经典的回调地狱:

doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log('Got the final result: ' + finalResult);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

现在,我们可以把回调绑定到返回的 Promise 上,形成一个 Promise 链:

doSomething().then(function(result) {
  return doSomethingElse(result);
})
.then(function(newResult) {
  return doThirdThing(newResult);
})
.then(function(finalResult) {
  console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);

then 里的参数是可选的,catch(failureCallback) 是 then(null, failureCallback) 的缩略形式。如下所示,我们也可以用箭头函数来表示:

doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => {
  console.log(`Got the final result: ${finalResult}`);
})
.catch(failureCallback);

**注意:**一定要有返回值,否则,callback 将无法获取上一个 Promise 的结果。(如果使用箭头函数,() => x 比 () => { return x; } 更简洁一些,但后一种保留 return 的写法才支持使用多个语句。)。


http://www.kler.cn/a/261.html

相关文章:

  • 凸包(convex hull)简述
  • 【网络安全 | 漏洞挖掘】通过模拟功能实现提权(Bugcrowd)
  • 【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数
  • 使用命令行管理git项目
  • Tailwind CSS 使用简介
  • 急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击
  • 现在的00后,实在是太卷了
  • 【再谈动态规划】
  • 【数据库】MySQL 解读事务的意义及原则
  • Jetpack太香了,让开发效率提升了不少
  • 谁说程序员不懂了浪费,女神节安排
  • 面试官问我按钮级别权限怎么控制,我说v-if,面试官说再见
  • linux下coredump文件产生及分析
  • 真1分钟搞懂缓存穿透、缓存击穿、缓存雪崩
  • 我从功能测试到python接口自动化测试涨到22k,谁知道我经历了什么......
  • 彻底搞懂nodejs事件循环
  • ChatGPT告诉你:项目管理能干到60岁吗?
  • 对于从事芯片行业的人来说,有哪些知识是需要储备的?
  • MySQL数据同步到 Redis 缓存的几种方法
  • python学习——【第四弹】
  • Jenkins自动化部署入门
  • 手机解锁方法:8个顶级的 Android 手机解锁软件
  • 邂逅多线程:Java多线程编程
  • 一个古老的html后台的模板代码
  • 如何在CSDN中使用ChatGPT
  • 求职(怎么才算精通JAVA开发)