异步:

核心:

现在运行的部分和将来运行的部分之间的关系

常用方案:

从现在到将来的等待,通常使用一个回调函数在结果返回时得到结果

控制台(因为console族是由宿主环境即游览器实现的)可能会使用异步机制,在出现问题时使用断点调试或者JSON化形成快照

异步和并行的区别:

异步:现在与将来的时间间隙
并行:同时发生的事

js引擎是单线程的,但是函数级别上执行顺序仍然存在不可预测

并发交互 并发协作

回调存在的问题:

回调地狱:人脑计划和回调驱动异步不匹配,导致思维难以迅速找到整个回调流程

信任问题:
1.调用过早
2.调用过晚或者没有调用
3.调用次数不正确(过多或者过少)
4.没有把参数正确传回
5.吞掉错误或者异常

事件循环(eventloop)

每一次时间循环称为一个tick

任务队列

在tick后面挂载的队列

回调带来的问题导致的需求:

一种更同步、更顺序、更阻塞的方式表达异步来提供与我们大脑思维一致

Promise顺势诞生:

对于回调函数带来的问题的解决:

1.调用过早

    本质:一个方法可能会同步执行也可能会异步执行,导致结果不可靠
    function result(data) {
console.log( a );//0(同步回调调用)、1(异步回调调用)
}
var a = 0;
ajax( "..pre-cached-url..", result );
a++;
    解决方案:then方法总是会异步调用其回调

2.调用过晚

    解决方案:在Promise对象执行resolve或reject方法后,then注册的回调函数会被自动执行

3.没有被调用

    解决方案:
1.只要决议,那么回调函数就会调用完成回调和拒绝回调其中一个
2.回调函数出现错误,可以在后续代码中捕获这些错误,当然回调已经被执行了
3.Promise本身永远不被决议,可以使用race这个竞态机制来获取一个输出信号,防止其永久挂住程序 4.调用次数过多 解决方案:Promise只会接受第一次决议,并默默地忽略任何后续调用,即多次决议是不会改变promise的状态 5.没有把参数正确传回 解决方案:Promise在决议时,只接受第一个参数,如果需要多个参数,可以使用数组或者对象包裹参数 6.吞掉错误或者异常 解决方案:在Promise创建过程中或者查看决议过程中,出现js异常,那么异常会被捕捉并且使得这个promise被拒绝,可以在下一个then中的reject回调捕获这个异常 7.保证Promise可信任(保证返回的值为Promise) 解决方案:Promise.resolve()
1.传入一个非Promise、非thenable值,那么会得到用这个值填充promise
2.传入一个真正的promise,那么会原样返回这个promise
3.传入一个非Promise的thenable值,会展开这个值,持续到得到一个非类Promise的值

第三方提供任务结束的能力,由我们决定代码下一步的行动

Promise 基本API

 new Promise((resolve,reject)=>{
resolve()、reject()
})
then() catch()

如何验证是否为promise 检测是否具有then方法

快捷创建已经被决议的Promise:

    Promise.resolve()//完成
Promise.reject()//拒绝

then和catch方法也会返回一个新的Promise

不要依赖promise回调的顺序,即两个p1.then();p2.then()不一定就是顺序,在p1本身是resolve一个promise原生对象时,p2会先执行

var p3 = new Promise( function(resolve,reject){
resolve( "B" );
} );
var p1 = new Promise( function(resolve,reject){
resolve( p3 );
} );
p2 = new Promise( function(resolve,reject){
resolve( "A" );
} );
p1.then( function(v){
console.log( v );
} );
p2.then( function(v){
console.log( v );
} );
// A B <-- 而不是像你可能认为的B A

局限性:

1.顺序错误处理,导致Promise链中的错误容易被忽略掉
2.单一值导致后续处理变量繁琐
3.单决议在事件中需要注意创建新的Promise链
4.Promise导致的性能问题

Promise对异步编程的贡献以及基本API了解的更多相关文章

  1. Promise和异步编程

    前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编 ...

  2. Promise对象 异步编程

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

  3. 《深入理解ES6》笔记—— Promise与异步编程(11)

    为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击.激活焦点.失去焦点等:再比如我们用ajax请求数据,使用回调函数获取返回值.这些都属于异步编程. 也许你已经大概知道Jav ...

  4. 异步编程——promise

    异步编程--promise 定义 Promise是异步编程的一个解决方案,相比传统的解决方法--回调函数,使用Promise更为合理和强大,避免了回调函数之间的层层嵌套,也使得代码结构更为清晰,便于维 ...

  5. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  6. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  7. 异步编程:When.js快速上手

    前些天我在团内做了一个关于AngularJS的分享.由于AngularJS大量使用Promise,所以我把基于Promise的异步编程也一并介绍了下.很多东西都是一带而过,这里再记录下. Angula ...

  8. 异步编程when.js

    when.js很小,压缩后只有数kb,gzip后的大小几乎可以忽略.在Node和浏览器环境里都可以使用when.js 首先,我们看一小段代码: var getData = function(callb ...

  9. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

随机推荐

  1. C#简单构架之EF进行读写分离+多数据库Mysql/SqlServer

    http://www.php361.com/index.php?c=index&a=view&id=3857 不建议用,太重的框架EF,仅仅参考一下别人的思路就好. [导读]最近因为项 ...

  2. Wireshark教程之二:Wireshark捕获数据分析

    使用 Wireshark 选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 以HTTP协议为例,一帧数据包一般包括以下几个部分: Fram ...

  3. 简单聊聊服务发现(redis, zk,etcd, consul)

    什么是服务发现? 服务发现并没有怎样的高深莫测,它的原理再简单不过.只是市面上太多文章将服务发现的难度妖魔化,读者被绕的云里雾里,顿觉自己智商低下不敢高攀. 服务提供者是什么,简单点说就是一个HTTP ...

  4. Android:Toolbar的图标尺寸问题

    之前一直使用的是Material Design的图标库,下载下来以后直接放入了对应文件夹,什么尺寸对应什么dpi都没有仔细研究过. 最近在Toolbar上添加几个不是MD图标库内的图标时发现,放入的图 ...

  5. Weyland-Energy 说明

    Weyland-Energy 说明 品名:Weyland-Energy 大脑能量补充剂功能:提神.提高注意力服用方法:建议饭后1颗,一天1次或者2次,间隔4-6小时,一天不要超过4片. 成分:每2颗含 ...

  6. Django(一)初始

    一:Web开发中的基本术语 1.两种架构 (1)cs架构 Client/Server:客户端-服务端架构 优点:CS能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后在提交给服务器,用户体验好 ...

  7. Springboot生成二维码并下载图片png支持打包成zip

    pom.xml <!--二维码--> <dependency> <groupId>com.google.zxing</groupId> <arti ...

  8. 一步一步实现kbmmw的httpsys使用https功能

    kbmmw的httpsys的功能已经实现了好长时间,但是现在各个平台都要求使用https来提供服务. 今天一步一步来说一下如何使用kbmmw 的httpsys功能支持https. 首先为了获得证书,我 ...

  9. ML-对偶(Duality)问题 KKT 条件

    Primal => Dual 现实中我们遇到的原优化问题, 写为标准型的话是这样的. \(min _w f(w) \\ s.t. \\ g_i(w) <=0 \\ h_i(w) = 0\) ...

  10. Layout POJ - 3169

    题目链接:https://vjudge.net/problem/POJ-3169 题意:有一些奶牛,有些奶牛相互喜欢,他们之间的距离必须小于等于一个K. 有些奶牛相互讨厌,他们之间的距离必须大于等于一 ...