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是什么?相关推荐

  1. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)

    本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...

  2. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  3. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  4. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  5. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  6. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  7. 自己动手写cpu pdf_自己动手写 Promise

    这段时间在学习Promise,但始终不得要领.为了更好地理解Promise,我决定自己实现一个简易版的Promise,以学习Promise工作原理.该工程名为ToyPromise,仓库地址如下: ht ...

  8. promise 和 async await区别

     什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...

  9. Promise - js异步控制神器

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 首先给来一个简单的demo看看Promise是怎么使用的: <!DOCTYPE html> ...

  10. Promise的实例用法

    设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan" ...

最新文章

  1. Android UI进阶之旅9 Material Design之沉浸式设计
  2. c# 之Web.config
  3. mysql leave的作用_MySQL数据库中DELIMITER的作用
  4. 爬楼梯(信息学奥赛一本通-T1204)
  5. git-分支的冲突与冲突的解决
  6. 在生意不好做的情况下, 你会选择坚持,还是去重新找一个新行业?
  7. 跳打开hdu 1208 (DP)
  8. codevs——1230 元素查找
  9. 基于NFC的Android读写软件,基于Android的NFC商场助手软件的设计与实现
  10. UG编程逆向工程如何做,一起来学习
  11. 尝试导入导出Alembic动画模型(.abc)
  12. i58300h和i7 8750h哪个好 i58300h和i7 8750h对比差距大吗
  13. 用vb调用bartender并打印
  14. LeetCode 1419. Minimum Number of Frogs Croaking
  15. 分享:Battle for Wesnoth 1.11.1 发布,韦诺之战
  16. 【转贴】古代四大名琴
  17. 转载:Android (争取做到)最全的底部导航栏实现方法
  18. hcip脱产班01天
  19. datastage mysql_DataStage 九、数据交换到MySQL以及乱码问题
  20. ASP.NET人事管理系统课程设计

热门文章

  1. 基于深度学习的单目视觉深度估计研究综述
  2. 英特尔400系列服务器芯片组,驱动支持列表再立功 Intel 400系列芯片组曝光
  3. 利用Get-FileHash工具进行哈希验证
  4. 前有刘德华,后有腾格尔和光头李进,明星为何都热衷于线上演唱会
  5. 假期娱乐和学习兼得型STEAM智能机器人有哪些?(2018-2019)
  6. C#-Winform - 调用笔记本摄像头实现拍照并保存
  7. Shell中如何删除首行和尾行
  8. MALLOC_PERTURB_ 环境变量
  9. 上千个游戏模型推荐 好用又实用,流行又火爆的都在这里
  10. 在web服务器上运行html文件,再调用cgi打开txt文件