ECMA Script 6_异步编程之 Promise

Promise 对象

异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题

比传统的解决方案——回调函数事件——更合理和更强大

是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理

  • 基本使用
  • const promise = new Promise(function(resolve, reject) {
        // ... some code
    
        if (/* 异步操作成功 */){
            resolve(value);
        } else {
            reject(error);
        }
    });
    
    promise
        .then(
            ()=>{
                console.log(‘成功的回调‘);
            },
            ()=>{
                console.log(‘失败的回调‘);
            },
        );
    console.log(‘主线程执行完了‘);
    
    /****    等同于    ****/
    const promise = new Promise((resolve, reject)=>{
        /*
        resolve 解决 成功    将 Promise 对象的状态 由初始化变成成功
        reject 拒绝 失败    将 Promise 对象的状态 由初始化变成失败
    
        Promise 三种状态
            初始化状态
            成功状态
            失败状态
        */
        setTimeout(function(){        const result = 202;
            console.log(‘请求成功了‘);
            resolve(result);    // 触发成功的回调
        }, 1000);
    });
    
    promise.then(result=>{
            console.log(‘成功的回调‘+result);
        }).catch((result)=>{
            console.log(‘失败的回调‘+result);
        });
    console.log(‘主线程执行完了‘);
  • Promise.resolve() 和 Promise.reject()    创建对象,状态为 成功 和 失败
  • Promise.all([要检测的对象数组]);    // 在所有的 promise 都触发 resolve 回调,才会成功。
  • 成功时接收 resolve ,失败只接收 reject。结果为数组
  • 实例
  • /**** 简单 独立异步任务 ****/
        const a = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 1000);
        });
    
        const aa = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 2000);
        });
    
        const aaa = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 3000);
        });
    
        Promise.all([a, aa, aaa]).then(result=>{
            console.log(result);    // 接收到数组是 每个 Promise 发送过来的结果
        }).catch(result=>{
            console.log(result);
        });
    
        console.log(‘主线程执行完了!‘);
    
    /**** 复杂 分线程关联任务 ****/
        const b = new Promise((resolve, reject)=>{
            setTimeout(function(){
                console.log("Done1"+"First");
                resolve("Done1"+"First");
            }, 1000);
        });
    
        b.then(result=>{
            return  new Promise((resolve, reject)=>{
                        setTimeout(function(){
                            console.log("Done2"+result);
                            resolve("Done2"+result);
                        }, 2000);
                    });
        }).catch()
         .then(result=>{
            return  new Promise((resolve, reject)=>{
                        setTimeout(function(){
                            console.log("Done3"+result);
                            resolve("Done3"+result);
                        }, 3000);
                    });
        }).catch()
         .then(result=>{
            console.log("All Done!"+result);
        }).catch()
    
        console.log(‘主线程执行完了!‘);

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

3

3

3

3

3

3

3

3

3

33

33

3

3

3

3

3

3

3

3

3

3

原文地址:https://www.cnblogs.com/tianxiaxuange/p/10123790.html

时间: 2024-10-10 11:22:37

ECMA Script 6_异步编程之 Promise的相关文章

异步编程之promise

是ES6中新增的异步编程解决方案. 1.构造函数. 可以通过promise构造函数来实例化. 数据: const imgs = [ 'https://img.alicdn.com/tps/i4/TB1fD77gfuSBuNkHFqDSutfhVXa.jpg_240x240q90.jpg', 'https://img.alicdn.com/simba/img/TB1CYyRdAUmBKNjSZFOSuub2XXa.jpg', 'https://img.alicdn.com/imgextra/i3/

Javascript异步编程之setTimeout与setInterval详解分析(一)

Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程( 注意: 特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛多多原谅!) 1. setTimeout与setInterval详细分析基本原理. 接下来这篇博客会总结setTimeout和setInterval基本点,对于上面三点会分三篇博客分别来总结,对于知道上面三点的人,但是又不是非常了解全面知识点的码农来说,没有关系的,我们可以慢慢来学习,来理解,或

net异步编程之await

net异步编程之await 初探asp.net异步编程之await 终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await. 写在前面(带着问题学习) 一.根据代码和执行结果,初探异步编程的执行过程. *问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗? *问题2:等待await数据返回交给等待线程再继续向下执行吗? *问题3:向await下一条语句执行的线程,是执行await的线程吗?

ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await

原文:ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await PS:异步编程的本质就是新开任务线程来处理. 约定:异步的方法名均以Async结尾. 实际上呢,异步编程就是通过Task.Run()来实现的. 了解线程的人都知道,新开一个线程来处理事务这个很常见,但是在以往是没办法接收线程里面返回的值的.所以这时候就该await出场了,await从字面意思不难理解,就是等待的意思. 执行await的方法必须是async修饰的,并且是Task

异步编程之Javascript Promises 规范介绍

什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们会想到回调函数,如下面的代码: getFileAsync("1.txt", function(error, result){      if(error){          throw error;      }     // 取得成功时的处理 }); 上面的代码定义了一个获取文件内容的

Javascript异步编程之setTimeout与setInterval详解

http://www.cnblogs.com/tugenhua0707/ 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程( 注意: 特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛多多原谅!) 1. setTimeout与setInterval详细分析基本原理. 接下来这篇博客会总结setTimeout和setInterval基本点,对于上面三点会分三篇博客分别来总结,对于知道上面三点的人,但是又不是非常了解全面知识点的码农来说,没有关系的,我们可以慢慢来学习,来理解,或者

异步编程之Async,Await和ConfigureAwait的关系

在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然async / await让异步编程更简单,但是有一些你可能不知道的细节和注意的地方  新关键字 微软在.NET框架中添加了async和await关键字.但是,使用它们,方法的返回类型应为Task类型.(我们将在稍后讨论例外情况)为了使用await关键字,您必须在方法定义中使用async.如果你在方

ECMA Script 6_函数的扩展

参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 函数不能有同名参数 参数初始化会形成一个单独作用域.实际执行的是 let a = 1; 参数默认值是惰性求值的 每次调用函数foo,都会重新计算x + 1,而不是默认p等于 100 let x = 99; function foo(p = x + 1) { console.log(p); } foo(); // 100 x = 100; foo(); // 101 function log(x, y = 'World')

ECMA Script 6_数值的扩展

1. 二进制 和 八进制 新的表示法 前缀 0b(或0B) 表示 二进制 前缀 0o(或 0O )表示 八进制 console.log(0b111110111 === 503); // true console.log(0o767 === 503); // true 如果要将 0b 和 0o 前缀的字符串数值 转为十进制,要使用 Number() 方法 2. Number.isFinite() 检查一个数值是否为有限的(finite),即 不是 Infinity 返回 true 只对数值有效 如