异步:

核心:

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

常用方案:

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

控制台(因为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. RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析

    文章目录 1. 原生的实现方式 2. Spring AMQP 的实现方式   要从奔溃的 RabbitMQ 中恢复的消息,我们需要做消息持久化.如果消息要从 RabbitMQ 奔溃中恢复,那么必须满足 ...

  2. php 逻辑题

    越长大约发现,高中学的数学,都还给了数学老师,一点都没有留住. 最近遇到了一个 逻辑题,然后想了半天,后来做出来了,我就发现了,我可能是一个假的理科生.很简单的样子. 废话不说,看看这道题吧. /** ...

  3. framework7 总结之前遇到的问题和踩过的坑

    官网上写的案例比较简单明了,我这里就将我使用时踩过的坑做一个总结,与大家共勉! 最近使用framework,基本全靠浏览官方文档,当然,有遇到了许多的错误,开始不知道哪里出问题也很着急,到最后发现问题 ...

  4. SQL Server 新增自动执行任务

    第一步右击SQL Server代理,新建作业 第二步选择常规,给你要执行的计划命名 第三步选择步骤,然后给步骤命名,选择类型,数据库,输入你要执行的语句. 第四步设置要执行的频率,根据业务需要,一般建 ...

  5. ABP 使用cache缓存

    using Abp.Application.Services.Dto; using Abp.Runtime.Caching; using Microsoft.Extensions.Configurat ...

  6. asp.net core 系列之允许跨域访问-1(Enable Cross-Origin Requests:CORS)

    接上篇的允许跨域 4.CORS 策略(Policy)的选项 这里讲解Policy可以设置的选项: 设置允许的访问源 设置允许的HTTP methods 设置允许的请求头(request header) ...

  7. C#生成唯一不重复订单号帮助类

    1.使用场景 通常,在做一些表单的功能时,需要生成唯一不重复的订单单号,本文提供的帮助类可以适合大多数场景的单号生成使用,拿来即用,方便快捷无重复.而且,在高并发的情况下也是可以使用的. 之前看到有人 ...

  8. 图解再谈ssh port forwarding-ssh隧道技术

    https://www.ramkitech.com/2012/04/how-to-do-ssh-tunneling-port-forwarding.html https://www.cnblogs.c ...

  9. 关于OA流程相关数据表的设计

    一.前言 近期有些同学问起流程的表设计,终于有时间能写下博客,并整理下之前所发布的文章. 之前的文章讲到的表设计,没有给全且还存在漏洞,在这里向各位同学表示歉意.这是我个人最新领悟的一些流程思维,欢迎 ...

  10. 【转载】使用宝塔Linux面板屏蔽某些IP访问你的服务器

    在服务器的运维过程中,有时候发现一些异常IP或者扫描漏洞攻击者IP访问你的网站,此时如果想屏蔽该IP访问你的服务器,可以通过云服务器厂商提供的安全组进行设置.如果服务器安装有宝塔面板,也可以通过宝塔面 ...