异步编程之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/31/TB2Yxd3gsuYBuNkSmRyXXcA3pXa_!!31-0-lubanu.jpg_200x200q90.jpg‘
]

实例化Promise对象接收一个参数是回调函数,这个函数又有两个参数,分别是resolve和reject。

resolve异步操作执行成功的回调函数。reject异步操作执行失败的回调函数。

const p = new Promise(function(resolve, reject) {
    const img = new Image();
    img.src = imgs[0];
    img.onload = function() {
        resolve(this);
    };
    img.onerror = function(err) {
        reject(err);
    }
});

Promise对象有三种状态:状态完全由异步操作的结果来决定。状态一旦改变之后就不会再改变。

pending(进行中)===>Resolved(已完成)

pending(进行中)===>Rejected(已失败)

这就创建了promise对象了,但是并没有任何效果。这时就需要用到promise原型上的方法:Promise.prototype.then(), Promise.prototype.catch (),用来处理异步操作结果。处理成功和捕获异常。

2.两个原型方法。Promise.prototype.then(), Promise.prototype.catch ()

const p = new Promise(function(resolve, reject) {
    const img = new Image();
    img.src = ‘ ‘;
    img.onload = function() {
        resolve(this);
    };
    img.onerror = function() {
        reject(new Error(‘图片加载失败‘));
    }
});
p.then(function(img) {
    document.body.appendChild(img);
}).catch(function(err) {
    console.log(err);
})

3.两个常用的静态方法。Promise.all(), Promise.resolve()

3.1 promise.all()

可以将多个promise实例封装成一个新的promise实例。使用的时候接受一个数组,这个数组就是多个promise组成的集合。除了接受数组,还可以接收具有itertor接口的对象。

当所有promise实例的状态都变为resolved,promise.all的状态才会变成resolved,此时返回值组成一个数组,传递给then中的resolve函数。只要有一个被rejected,promised.all的状态就变成rejected,此时第一个被rejected的实例的返回值,会传递给p的回调函数。

function loadImg(url) {
    const p = new Promise(function(resolve, reject) {
        const img = new Image();
        img.src = url;
        img.onload = function() {
            resolve(this);
        };
        img.onerror = function() {
            reject(new Error(‘图片加载失败‘));
        }
    });
    return p;
}
const allDone = Promise.all([loadImg(imgs[0]), loadImg(imgs[1]), loadImg(imgs[2])]);
allDone.then(function(datas) {
    datas.forEach(function(item, i) {
        document.body.appendChild(item);
    })
}).catch(function(err) {
    console.log(err);
})

三张图片全部在页面显示。如果换成:

const allDone = Promise.all([loadImg(imgs[0]), loadImg(imgs[1]), loadImg(imgs[2]), loadImg(‘ ‘)]);

一张都加载不出来,并且控制台打印出错信息。

3.2 Promise.resolve()

将一个对象转换为promise对象。

用法1:接收一个promise实例,返回promise实例,不做任何修改。

Promise.resolve(loadImg(imgs[0])).then(function(img){
    document.body.appendChild(img);
})

用法2:将对象转为promise对象,然后就立即执行thenable对象的then方法。

用法3:参数是一个基本数据类型或者不传参数,那么返回一个状态为resolved即成功的promise对象。

Promise.resolve(‘perihe‘).then(function(str) {
    console.log(str); //perihe
})

不传参:

const p = Promise.resolve()
console.log(p);

状态为resolved的promised对象:

原文地址:https://www.cnblogs.com/PeriHe/p/8976208.html

时间: 2024-07-30 05:27:15

异步编程之promise的相关文章

ECMA Script 6_异步编程之 Promise

Promise 对象 异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题 比传统的解决方案——回调函数和事件——更合理和更强大 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理 基本使用 const promise = new Promise(function(resolve, reject) { // ... s

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.如果你在方

QT核心编程之Qt线程 (c)

QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类.线程安全传递事件的方式和全局Qt库互斥量允许你从不同的线程调用Qt的方法.Qt中与线程应用相关的类如表6所示. 表6 Qt中与线程相关的类 使用线程需要Qt提供相应的线程库的支持,因此,在编译安装Qt时,需要加上线程支持选项. 当在Windows操作系统上编译Qt时,线程支持是在一些编译器上的一个

[深入浅出WP8.1(Runtime)]网络编程之HttpClient类

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT