promise简析

promise可以解决多个回调函数嵌套问题,将嵌套所表示的流程通过同步的代码更加清晰的表达出来。

promise的用法与使用配置文件很类似:启动异步函数,在then里面配置好异步函数成功或执行失败的回调函数,然后就可以去干别的事了。

一个简单示例的执行过程

一个简单的示例如下:

var promise = new Promise(function(resolve, reject) {// 异步操作的代码.....if (true){resolve("已解决");} else {reject("出错了");}});promise.then(function(value){console.log(value);},function(error){console.log(error);});

上面的代码的时序图大体如下:

这里写图片描述
其中:

client – 主程序,Async – 异步函数,Promise,ResolvedInvoke – resolved状态回调函数,RejectedInvoke – rejected状态回调函数,resolve – resolve函数

几个关键过程说明如下:

(1.4 )调用异步函数Async之后,然后执行(1.5)会立即返回一个promise对象,然后主函数和异步函数同时往下执行。
(2.2) 指定promise的回调函数,主程序的任务完成,退出
(1.6)异步函数退出,调用resolve(),然后执行(1.7)改变promise的状态
当promise状态改变之后,执行(1.8)调用相应的回调函数。

所以,promise的执行过程大体如下:主程序创建promise并指定promise各种状态下的回调函数,promise调用异步函数并保存异步函数的执行状态,当异步函数退出时,可以调用resolve/reject改变promise的状态,promise在状态变化时调用相应的回调函数。

promise对象

promise保存着异步函数的执行状态。

这里写图片描述

异步函数通过调用resolve/reject改变promise的状态,主函数调用promise的then()方法指定promise在不同状态下的回调函数。然后,主程序和异步程序可以各自往下执行,当promise状态改变时,它会自动调用相应的回调函数。

也就是,主函数装配promise,异步函数改变promise状态,promise监听自身变化,调用相应回调函数进行处理。

then

then函数指定promise的回调函数,可以链式操作,可以返回值,其返回值如果不是一个Promise对象,则直接作为下一个then的参数,否则进行返回的这个Promise的异步函数,根据执行结果继续调用下一个then。

所以,只有在then里返回Promise的情况下,才能看出promise的厉害和用处。

作用

主要是解决多个回调函数的嵌套问题。下面例子就是两个原本需要嵌套的回调函数,使用同步的方式表达出来。

var promise = doSomething(false);promise.then(function(value){console.log(value);return doSomethingElse(true);},function(error){console.log(error);return doSomethingElse(false);}).then(function(){console.log("成功后接着处理");},function(){console.log("出错后接着处理");});function doSomething(param){//这里省略一些异步操作return new Promise(function(resolve, reject) {if (param){resolve("已解决");} else {reject("出错了");}});}function doSomethingElse(param){//这里省略一些异步操作return new Promise(function(resolve, reject) {if (param){resolve();} else {reject();}});}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python cookies过期_Python3中关于cookie的创建与保存

1.cookie的作用cookie 是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据,就像有些网站上的一些数据是需要登录后才能看得到,那么想抓取某个页面内容,就需要用到cookie来模拟登陆了。在用cookie模拟登陆的时候&…

GIS-004-Cesium版权信息隐藏

.cesium-widget-credits { display: none; } .cesium-viewer .cesium-widget-credits { display: none; }转载于:https://www.cnblogs.com/defineconst/p/5965531.html

webpaper网页出题语言

目的 方便编写web试题,直接使用几个简单的标签,就可以生成一份可以在web上使用,并且可以打印出来的题。 效果预览 考卷打印效果 生成考卷发送给学生,或打印出来线下考 答案卷打印效果: 通过点击”显示答案”生成答…

python教程很详细_Python编程入门教程:从入门到高级,非常详细

本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧:这里给初学Python的朋友提供一些建议和指导吧。大神请无视,俗话说:授人以鱼不如授人以渔。所以我这里只是阐述学习过程,并不会直接详细写某个…

NOIP复习资料——往年习题精选

一、计算机系统 1.在以下各项中,()不是CPU的组成部分。(NOIP2007) A.控制器B.运算器C.寄存器D.主板 【答案】D。CPU由控制器、运算器和寄存器组成。 2.在下列各项中…

【笔记】js重写

js重写,以localstorage为例: var originalSetItem localStorage.setItem; localStorage.setItem function(){// 这里做一些额外的事...//继续调用原来的方法originalSetItem.apply(this, arguments); } 代码引自:这里

(中英)作文 —— 标题与小标题

一个押韵的标题,会十分讨巧; 当世界年轻的时候, 当中国年轻的时候,当世界衰老的时候;1. 英文 A year of no significance. An animal of no significance.2. 名著的变形 双城记:A tale of Two cities Tales…

table 表格点击当前行按钮隐藏当前的另一个按钮_Excel表格为什么那么慢已经应该如何解决(四)一类特殊的函数易变函数(volatile function)...

我们,让Excel变简单今天我们把主题聚焦在一类特殊函数造成的问题上——volatile function。这一类函数有人把他们翻译成“易变函数”,其实挺贴切的。本系列其他文章:Excel表格为什么那么慢已经应该如何解决(一)概述Excel表格为什么那么慢已经…

h5 storage事件监听

分析 引用《h5移动web开发指南》上的话: “当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发” 所以,localStorage的例子运行需要如下条件: 同一浏览器打开了两个同源页面其中一个网页修…

python工作台_FreeCAD二次开发-创建Python工作台,添加菜单栏和工具条,FreeCAD命令

FreeCAD作为一款基于OpenCasCAD内核的开源CAD软件,可以在GitHub上下载源代码。阅读源代码,有助于我们学习CAD软件架构,了解底层几何算法。由博主Caesar卢尚宇自学整理(纯粹出于对三维CAD软件开发的热爱)内容出自FreeCAD官方社区https://wiki.…

3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)

今天用用前两天总结的css3新效果写了一个3d照片环的效果&#xff0c;其中还有些bug大家可以看一看&#xff0c;一起改进。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><sty…

h5离线应用

h5离线应用 所谓离线应用&#xff0c;就是断网之后还可以运行的应用。h5提供了application cache&#xff0c;可以保存网页的离线数据。CSDN的Markdown编辑器就运用了application cache&#xff0c;在没有网络的情况下&#xff0c;一样可以正常使用&#xff0c;这就是一个很好…

[deviceone开发]-do_RichLabel的简单示例

一、简介 do_RichLabel支持html格式的文本内容&#xff0c;但是只支持部分标签&#xff0c;这个示例列出了一些支持的常用标签&#xff0c;android能支持的标签相对ios更少 二、效果图 三、相关下载 https://github.com/do-project/code4do/tree/master/richlabel_demo 四、相关…

使用rpm包升级ntpd服务_服务器准备升级,小程序将暂停使用

今天说3件事情&#xff1a;一、由于用户增速超出了我们的预期&#xff0c;为确保法助攻小程序的使用体验&#xff0c;我们购买了更高配置的服务器&#xff0c;目前&#xff0c;内部测试已完成&#xff0c;现决定对服务器进行正式升级。服务器升级时间&#xff1a;8月7日(本周五…

重装Nodejs后,webstorm代码报错问题

项描述现象之前没有问题的代码&#xff0c;突然出现很多奇怪的错误原因没有更新webstorm的Nodejs路径设置造成的解决办法重新设置webstorm的Nodejs路径&#xff0c;见下图 重新选择Nodejs安装目录&#xff0c;点击应用

java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作

写在开头&#xff1a;本文是转载于掘金上的一篇文章&#xff0c;已获得原作者授权&#xff0c;我会在文章最后放上原作者和原文链接。前言平时操作集合数据&#xff0c;我们一般都是for或者iterator去遍历&#xff0c;不是很好看。java提供了Stream的概念&#xff0c;它可以让我…

ESlint静态代码检测工具安装

安装eslint&#xff0c;根目录下执行&#xff1a; F:\my\temp> npm install eslint --save-dev 初始化eslint&#xff0c;会生成一个.eslintrc.js配置文件&#xff0c;执行&#xff1a; F:\my\temp> F:\my\temp\node_modules\.bin\eslint --init 运行&#xff0c;对某…

python随机划分数据集_Python之机器学习-sklearn生成随机数据

sklearn-生成随机数据import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontPropertiesfrom sklearn import datasets%matplotlib inlinefont FontProperties(fname/Library/Fonts/Heiti.ttc)多标签分类数据X1, y1 …

DocumentFragment使用

DocumentFragment相当于一份脱离document的文档&#xff0c;所以往其中添加元素&#xff0c;对其中元素做各种操作都不会影响到document文档&#xff0c;不会触发回流、重绘和重组等。使用它的好处在于&#xff0c;你可以合并多个dom操作&#xff0c;减少操作dom的次数。 var …

这几天都是在公司慢待

待会还要把伞缝好&#xff0c;对于现在是不是要重新买米和油今天晚上给出结果。 转载于:https://www.cnblogs.com/bkchengzheng/p/5979404.html