今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:
需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject。(具体为何会有这种需求我也不太记得了。。。

现在回头看,一定会有其他的常规解决方案)。

不过本着对未知牛角尖的专研精神(最近有点闲),在咨询知乎大神,重读阮大神的《es6入门》书中promise一章后,

找到了一个原生js的解决方案:Promise.race。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<button onclick="getInterface()">发送请求</button>
<button id="cancel">取消调用接口</button>
<script type="text/javascript">
//Promise.race([a,b])参数为一个promise对象组成的数组,
//此方法用来比较啊a和b哪一个promise先返回,Promise.race结果就返回这个先返回的promise参数 function getInterface() {
var promise1 = new Promise(function(resolve, reject) {
            //模拟ajax异步请求
setTimeout(resolve, 3000, '接口返回成功!');
});
var promise2 = new Promise(function(resolve, reject) {
document.querySelector('#cancel').addEventListener('click', function() {
reject('取消等待接口!');
});
}); Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
}).catch(function(value) {
console.log(value);
});
}
</script>
</body>
</html>

上面的代码点击发送请求按钮后,调用getIterface方法,

方法内创建并立即执行两个promise函数:promise1和promise2。Promise.race方法立即开始监听这两个promise对象的状态。

1. 如果3秒内用户有任何操作,那么promise1内的resolve方法被调用:此时“接口”返回成功,Promise.race不再监听promise2的状态,

直接返回接口的返回结果:'接口返回成功!'。

2. 如果3秒内用户点击取消调用接口按钮 ,那么promise2内的reject方法被调用,此时Promise.race不再监听promise2(异步接口)的返回状态,

直接返回promise2的返回结果:'取消等待接口'。

这样就可以模拟外部中断promise返回结果了,比如 promise1是一个ajax请求,那么就可以在返回前在Promise.race中abort()请求了。

如何在外部终止一个pengding的promise对象的更多相关文章

  1. 手把手教你实现一个完整的 Promise

    用过 Promise,但是总是有点似懂非懂的感觉,也看过很多文章,还是搞不懂 Promise的 实现原理,后面自己边看文章,边调试代码,终于慢慢的有感觉了,下面就按自己的理解来实现一个 Promise ...

  2. Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...

  3. ES6 Promise 对象

    Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Pro ...

  4. 微信小程序Promise对象

    Promise 对象 Promise 的含义 基本用法 Promise.prototype.then() Promise.prototype.catch() Promise.prototype.fin ...

  5. 13.Promise 对象

    Promise 对象 Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其 ...

  6. ES6的Promise对象

    http://es6.ruanyifeng.com/#docs/promise Promise 对象 Promise 的含义 基本用法 Promise.prototype.then() Promise ...

  7. ES6的新特性(15)——Promise 对象

    Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了 ...

  8. ES6入门之Promise对象

    1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...

  9. 不难懂————Promise对象 + 详解

    1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...

随机推荐

  1. php 理解

    <?php class t { var $num; var $dynamic_function; public function dynamic_function() { $func = $th ...

  2. Matplotlib初体验

    为一个客户做了关于每个差异otu在时间点上变化的折线图,使用python第一次做批量作图的程序,虽然是很简单的折线图,但是也是第一次使用matplotlib的纪念. ps:在第一个脚本上做了点小的改动 ...

  3. ngx-bootstrap使用02 Accordion组件的使用

    1 Accordion组件 该组件通过一个可折叠的控制面板去在有限空间内显示更多的信息 according组件在可折叠指令的最外层,该组件提供了一些列的项目列表去显示被折叠的内容,这些项目列表包含he ...

  4. Struts简介、原理及简单实现

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  5. 【Python3之匿名函数及递归】

    一.匿名函数及内置函数补充 1.语法 Python使用lambda关键字创造匿名函数.所谓匿名,意即不再使用def语句这样标准的形式定义一个函数. 语法: lambda [arg1[, arg2, . ...

  6. 第十三章:Python の 网络编程进阶(二)

    本課主題 SQLAlchemy - Core SQLAlchemy - ORM Paramiko 介紹和操作 上下文操作应用 初探堡垒机 SQLAlchemy - Core 连接 URL 通过 cre ...

  7. Python 抽象篇:面向对象之高阶用法

    1.检查继承 如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数 如果想知道已知类的基类,可以直接使用特殊特性__bases__ 同时,使用isinstance方法检查一个 ...

  8. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  9. css的学习笔记

    CSS3有哪些新特性? 1. CSS3实现圆角(border-radius),阴影(box-shadow), 2. 对文字加特效(text-shadow.),线性渐变(gradient),旋转(tra ...

  10. SharePoint客户端js对象模型

    'use strict'; var context = SP.ClientContext.get_current(); var user = context.get_web().get_current ...