promise是什么?
promise: 是一个异步操作的对象 ,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。状态的改变有两种情况:Pending->Resolved,Pending->Rejected。
可以看到Promise是一个构造函数,他本身有 all, reject, resolve 方法,在他的原型上有 then, catch方法.
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
- resolve函数的作用,将Promise对象的状态从“未完成”变成“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
- reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
- then方法可以接受两个回调函数作为参数,第一个对应resolve的回调,第二个对应reject的回调。
/**代码利用setTimeout函数实现异步操作,2秒生成一个数字,通过异步操作结果确定执行resolve函数还是reject函数*/
function getNumber(){return new Promise(function(resolve, reject) {setTimeout(function(){var number = Math.ceil(Math.random()*10);if(number <= 5){resolve(number)}else{reject('数字太大了');}}, 2000) })
}
getNumber().then(function(data){console.log('resolve');console.log(data);},function(reason){console.log('reject');console.log(reason);}
)
Promise对象除了then方法,还有一个catch方法.它和then的第二个参数一样,用来指定reject的回调.用法如下:
getNumber().then(function(data){console.log('resolved');console.log(data);}).catch(function(reason){console.log('rejected');console.log(reason);});
它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中:
getNumber().then(function(data){console.log('resolved');console.log(data);console.log(odata); }).catch(function(reason){console.log('rejected');console.log(reason);});
如果要在三个异步操作执行完成后再执行某操作,那么就需要用到all方法.
function runAsync1(){var p = new Promise(function(resolve, reject){setTimeout(function(){var number = Math.ceil(Math.random()*10);console.log('1执行完成');resolve(number);}, 2000)});return p;
}
function runAsync2(){var p = new Promise(function(resolve, reject){setTimeout(function(){var number = Math.ceil(Math.random()*10);console.log('2执行完成');resolve(number);}, 2000)});return p;
}
function runAsync3(){var p = new Promise(function(resolve, reject){setTimeout(function(){var number = Math.ceil(Math.random()*10);console.log('3执行完成');resolve(number);}, 2000)});return p;
}
Promise.all([runAsync1(), runAsync2(), runAsync3()]).then(function(result){console.log(result);})
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调
promise主要是用来解决异步编程的。
基于promise这种特殊的结构,我们可以用它来处理一些异步操作。
promise虽然方便 但是也有他的缺点比如一旦创建后就无法中途停止。
promise是什么?相关推荐
- setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)
本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...
- C++多线程:异步操作std::async和std::promise
文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...
- ES6中的Promise详解
Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...
- 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...
- promise实现多个请求并行串行执行
早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...
- 异步编程之Promise(2):探究原理
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 自己动手写cpu pdf_自己动手写 Promise
这段时间在学习Promise,但始终不得要领.为了更好地理解Promise,我决定自己实现一个简易版的Promise,以学习Promise工作原理.该工程名为ToyPromise,仓库地址如下: ht ...
- promise 和 async await区别
什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...
- Promise - js异步控制神器
微信小程序开发交流qq群 581478349 承接微信小程序开发.扫码加微信. 正文: 首先给来一个简单的demo看看Promise是怎么使用的: <!DOCTYPE html> ...
- Promise的实例用法
设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan" ...
最新文章
- Android UI进阶之旅9 Material Design之沉浸式设计
- c# 之Web.config
- mysql leave的作用_MySQL数据库中DELIMITER的作用
- 爬楼梯(信息学奥赛一本通-T1204)
- git-分支的冲突与冲突的解决
- 在生意不好做的情况下, 你会选择坚持,还是去重新找一个新行业?
- 跳打开hdu 1208 (DP)
- codevs——1230 元素查找
- 基于NFC的Android读写软件,基于Android的NFC商场助手软件的设计与实现
- UG编程逆向工程如何做,一起来学习
- 尝试导入导出Alembic动画模型(.abc)
- i58300h和i7 8750h哪个好 i58300h和i7 8750h对比差距大吗
- 用vb调用bartender并打印
- LeetCode 1419. Minimum Number of Frogs Croaking
- 分享:Battle for Wesnoth 1.11.1 发布,韦诺之战
- 【转贴】古代四大名琴
- 转载:Android (争取做到)最全的底部导航栏实现方法
- hcip脱产班01天
- datastage mysql_DataStage 九、数据交换到MySQL以及乱码问题
- ASP.NET人事管理系统课程设计