介绍

所谓Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
缺少场景支撑,对于新手而言,很难理解Promise的意义。
在《你不知道的JavaScript中》有个场景介绍得很形象:
我走到快餐店的柜台,点了一个芝士汉堡。我交给收银员1.47美元。通过下订单并付款,我已经发出了一个对某个值(就是那个汉堡)的请求。我已经启 动了一次交易。
但是,通常我不能马上就得到这个汉堡。收银员会交给我某个东西来代替汉堡:一张带有 订单号的收据。订单号就是一个 IOU(I owe you, 我欠你的)承诺(promise),保证了最 终我会得到我的汉堡。
所以我得好好保留我的收据和订单号。我知道这代表了我未来的汉堡,所以不需要担心, 只是现在我还是很饿!
在等待的过程中,我可以做点其他的事情,比如给朋友发个短信:“嗨,要来和我一起吃 午饭吗?我正要吃芝士汉堡。”
我已经在想着未来的芝士汉堡了, 尽管现在我还没有拿到手。 我的大脑之所以可以这么 做,是因为它已经把订单号当作芝士汉堡的占位符了。从本质上讲,这个占位符使得这个 值不再依赖时间。这是一个未来值。
终于, 我听到服务员在喊“订单 113” , 然后愉快地拿着收据走到柜台, 把收据交给收银 员,换来了我的芝士汉堡。
换句话说, 一旦我需要的值准备好了, 我就用我的承诺值(value-promise)换取这个值 本身。
但是,还可能有另一种结果。他们叫到了我的订单号,但当我过去拿芝士汉堡的时候,收 银员满是歉意地告诉我:“不好意思,芝士汉堡卖完了。”除了作为顾客对这种情况感到愤 怒之外,我们还可以看到未来值的一个重要特性:它可能成功,也可能失败。
每次点芝士汉堡,我都知道最终要么得到一个芝士汉堡,要么得到一个汉堡包售罄的坏消息,那我就得找点别的当午饭了。
所以Promise的出现其实是作为异步编程的一种解决方案。比传统的解决方案-回调函数和事件-更加合理、强大。
Promise的基本用法
var p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'done');
})
p1.then(data=>{
console.log(data); // done
})
Promise一个明显的好处便是可以用来解决回调地狱。特别是在处理多个回调相互依赖的情况。
使用Promise解决多个异步依赖调用
Promise提供了一个方法Promise.all([p1,p2,p3]) ,用于将多个Promise实例,包装成一个新的Promise实例。接收的参数是一个数组,p1、p2、p3都是Promise对象。
此时Promise.all的状态取决于它的参数。
分两种情况:
Promise.all的状态才会变成resolve;Promise.all的状态就会变成reject;所以我们可以用Promise.all()来解决多个异步依赖调用。
比如我们平常经常遇到的一种情况:
网站中需要先获取用户名,然后再根据用户名去获取用户信息。这里获取用户名getUserName()和获取用户信息getUser()都是调用接口的异步请求。在获取用户信息之前,需要先获得用户名。也就是说getUser依赖于getUserName的状态。所以我们可以将这两个请求通过Promise.all()封装成一个新的Promise对象。
function getUserPromise(promiseX, promiseY){
return Promise.all([promiseX, promiseY])
.then(values =>
// 返回的values由 promiseX 与 promiseY返回的值所构成的数组。
values
)
}
function getUserName(){
let data = 'superman';
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 1000);
})
}
function getUser(){
let data = {
id:1,
username: 'superman',
gender: 'male'
}
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 2000);
})
}
getUserPromise(getUserName(), getUser())
.then(data => {
// 这里的data就是包含了getUserName 和 getUser返回值所组成的数组
console.log(data); // [ 'superman', { id: 1, username: 'superman', gender: 'male' } ]
})
使用Promise的链式调用
function getUserName(){
let data = 'superman';
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 4000);
})
}
function getUser(username){
let data = {
id:1,
username: 'superman',
gender: 'male'
}
return new Promise((resolve, reject) => {
if(username){
setTimeout(resolve(data), 2000);
}
else{
reject('err');
}
})
}
getUserName().then(username => {
return getUser();
})
.then(user => {
console.log(user);
})
.catch(err => {
console.log(err);
})
有了Promise的链式调用,再也不同担心回调地狱的问题了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# promise链式调用
# es6
# promise
# 链式调用
# s
# C#实现异步编程的方法
# Java 异步编程实践_动力节点Java学院整理
# 基于javascript的异步编程实例详解
# 详解js的异步编程技术的方法
# 浅谈JavaScript异步编程
# C#编程总结(六)详解异步编程
# Java CountDownLatch完成异步回调实例详解
# Activity/Fragment结束时处理异步回调的解决方案
# Java 异步回调机制实例分析
# js异步编程小技巧详解
# 芝士
# 多个
# 都是
# 链式
# 回调
# 未来
# 是一个
# 走到
# 才会
# 我已经
# 收银员
# 就会
# 是在
# 给我
# 我还
# 我会
# 有个
# 告诉我
# 还可以
# 很难
相关文章:
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
,怎么在广州志愿者网站注册?
测试制作网站有哪些,测试性取向的权威测试或者网站?
javascript基本数据类型及类型检测常用方法小结
网站制作报价单模板图片,小松挖机官方网站报价?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在VPS电脑上快速搭建网站?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
建站之星代理如何获取技术支持?
建站之星代理平台如何选择最佳方案?
代刷网站制作软件,别人代刷火车票靠谱吗?
建站之星后台管理:高效配置与模板优化提升用户体验
如何构建满足综合性能需求的优质建站方案?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
C++中引用和指针有什么区别?(代码说明)
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何在万网ECS上快速搭建专属网站?
C++如何编写函数模板?(泛型编程入门)
如何用搬瓦工VPS快速搭建个人网站?
如何选择可靠的免备案建站服务器?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星后台密码遗忘或太弱?如何重置与强化?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何在腾讯云服务器上快速搭建个人网站?
建站之星如何通过成品分离优化网站效率?
建站之星如何助力网站排名飙升?揭秘高效技巧
黑客如何利用漏洞与弱口令入侵网站服务器?
小型网站制作HTML,*游戏网站怎么搭建?
MySQL查询结果复制到新表的方法(更新、插入)
电商平台网站制作流程,电商网站如何制作?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
建站主机如何选?高性价比方案全解析
如何快速选择适合个人网站的云服务器配置?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
网站专业制作公司有哪些,做一个公司网站要多少钱?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
建站之星安装模板失败:服务器环境不兼容?
如何配置支付宝与微信支付功能?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
免费ppt制作网站,有没有值得推荐的免费PPT网站?
建站之星后台密码遗忘如何找回?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何通过云梦建站系统实现SEO快速优化?
如何获取开源自助建站系统免费下载链接?
如何高效搭建专业期货交易平台网站?
香港服务器如何优化才能显著提升网站加载速度?
SQL查询语句优化的实用方法总结
*请认真填写需求信息,我们会在24小时内与您取得联系。