Promise详解

本文主要通过对Promise的八大特性讲解,来详细探讨Promise。

1.立刻执行性

const p = new Promise((resolve, reject) => {
    console.log("create a promise");
    resolve("success");
});

console.log("after new Promise");
p.then((value) => {
    console.log(value);
});

执行结果:

分析:只要一创建Promise,就会立即执行Promise的内部函数

2.三大状态(Promise有且只有三种状态pending,resolved,rejected)

var p1 = new Promise((resolve, reject) => {
    resolve(1);
});
var p2 = new Promise((resolve, reject) => {
    setTimeout(function () {
        resolve(2);
    }, 500);
});
var p3 = new Promise((resolve, reject) => {
    setTimeout(function () {
        reject(3);
    }, 500);
});
console.log(‘0‘, p1);
console.log("1", p2);
console.log("2", p3);
setTimeout(() => {
    console.log("3", p2);
}, 1000);
setTimeout(function () {
    console.log("4", p3);
}, 1000);
p1.then((value) => {
    console.log("5", value);
});
p2.then((value) => {
    console.log("6", value);
});
p3.catch((err) => {
    console.log("7", err);
});

结果:

3.状态不可逆(Promise状态只能由pending到resolved或者由pending到rejected)

const p1 = new Promise(function (resolve, reject) {
    resolve("success1");
    resolve("success2");
});

const p2 = new Promise(function (resolve, reject) {
    resolve("success");
    reject("reject");
});

p1.then(function (value) {
    console.log(value);
});

p2.then(function (value) {
    console.log(value);
});

结果:

4.then回调异步性

const p = new Promise(function (resolve, reject) {
    resolve("success");
});

p.then(function (value) {
    console.log(value);
});

console.log("which one is called first ?");

输出结果:

5.支持链式调用

const p = new Promise((resolve, reject) => {
    resolve(1);
});
p.then((value) => {
    console.log(value);
    return value * 2;
})
.then((value) => {
    console.log(value);
})
.then((value) => {
    console.log(value);
    return Promise.resolve(‘resolve‘);
})
.then((value) => {
    console.log(value);
    return Promise.reject(‘reject‘);
})
.then((value) => {
    console.log(‘resolve: ‘ + value);
}, (err) => {
    console.log(‘reject: ‘ + err);
})

输出结果:

6.异常处理:

const p1 = new Promise( function(resolve,reject){
    foo.bar();
    resolve( 1 );
});
p1.then((value)=>{
        console.log(‘p1 then value: ‘ + value);
    },
    (err)=>{
        console.log(‘p1 then err: ‘ + err);
    }
)
.then((value)=>{
        console.log(‘p1 then then value: ‘+value);
    },
    (err)=>{
        console.log(‘p1 then then err: ‘ + err);
    }
);
const p2 = new Promise((resolve,reject)=>{
    resolve( 2 );
});
p2.then(
    (value)=>{
        console.log(‘p2 then value: ‘ + value);
        foo.bar();
    },
    (err)=>{
        console.log(‘p2 then err: ‘ + err);
    }
)
.then(
    (value)=>{
        console.log(‘p2 then then value: ‘ + value);
    },
    (err)=>{
        console.log(‘p2 then then err: ‘ + err);
        return 1;
    }
).then(
    (value)=>{
        console.log(‘p2 then then then value: ‘ + value);
    },
    (err)=>{
        console.log(‘p2 then then then err: ‘ + err);
    }
);

输出:

7.Promise.resolve

let p1 = Promise.resolve(1);
let p2 = Promise.resolve(p1);
let p3 = new Promise(function (resolve, reject) {
    resolve(1);
});
let p4 = new Promise(function (resolve, reject) {
    resolve(p1);
});
console.log(p1 === p2);
console.log(p1 === p3);
console.log(p1 === p4);
console.log(p3 === p4);
p4.then(function (value) {
    console.log(‘p4=‘ + value);
});
p2.then(function (value) {
    console.log(‘p2=‘ + value);
})
p1.then(function (value) {
    console.log(‘p1=‘ + value);
})

输出结果:

8.resolve和reject

const p1 = new Promise((resolve, reject)=>{
    resolve(Promise.resolve(‘resolve‘));
});
const p2 = new Promise((resolve, reject)=>{
    resolve(Promise.reject(‘reject‘));
});

const p3 = new Promise((resolve, reject)=>{
    reject(Promise.resolve(‘resolve‘));
});

p1.then((value)=>{
        console.log(‘fulfilled: ‘ + value);
    },
    (err)=>{
        console.log(‘rejected: ‘ + err);
    });
p2.then((value)=>{
        console.log(‘fulfilled: ‘ + value);
    },
    (err)=>{
        console.log(‘rejected: ‘ + err);
    });
p3.then((value)=>{
        console.log(‘fulfilled: ‘ + value);
    },
    (err)=>{
        console.log(‘rejected: ‘ + err);
    });

输出结果:

时间: 2024-10-25 20:13:01

Promise详解的相关文章

关于Promise详解

异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务,无法实现并行节约时间 Promise Promise本意是承诺,在程序中的意思就是承诺我过一段时间后会给你一个结果. 什么时候会用到过一段时间?答案是异步操作,异步是指可能比较长时间才有结果的才做,例如网络请求.读取本地文件等 Promise的三种状态 Pending Promise对象实例创建时

ES6 Promise 详解

一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: 1.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: (1).pending: 初始值 (2).fulfilled:  操作成功 (3).rejected: 操作失败 只有异步操作的结果可以决定当前是哪一个状态,任何其他状态都无法改变这个状态. 2.一旦状态改变,就不会再

触碰jQuery:AJAX异步详解

触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和XHTML来表示. 2)   使用DOM模型来交互和动态显示. 3)   使用XMLHttpRequest来和服务器进行异步通信. 4)   使用javascript来绑定和调用.

测试框架mochajs详解

测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩子函数的描述参数 异步的钩子函数 全局钩子 延迟启动测试 测试用例TODO 仅执行一个用例集/用例 跳过哪些用例集/用例 重新执行用例 动态生成用例 测试时间 测试超时 用例集执行超时 用例执行超时 钩子函数超时 diff差异比较功能 mocha使用命令和参数 mocha

Angular.js中处理页面闪烁的方法详解

Angular.js中处理页面闪烁的方法详解 前言 大家在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况.数据还没响应,但页面已经渲染了.这是因为浏览器和angularjs渲染页面都需要消耗一定的时间,这个间隔可能很小,甚至让人感觉不到,这种情况一切正常,但这个时间也可能很长,这时候用户可能会看到满屏尽是{{xxxx}}.这种情况被叫做"Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.".

jQuery的deferred对象详解(转)

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuery的全部ajax代码都被改写了.但是,它比较抽象,初学者很难掌握,网上的教程也不多.所以,我把自己的学习笔记整理出来了,希望对大家有用. 本文不是初级教程,针对的读者是那些已经具备

触碰jQuery:AJAX异步详解(转)

AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和XHTML来表示. 2)   使用DOM模型来交互和动态显示. 3)   使用XMLHttpRequest来和服务器进行异步通信. 4)   使用javascript来绑定和调用. 通过AJAX异步技术,可以在客户端脚本与web服务器交互数据的过程中使用XMLHttpRequest对象来完成HTTP请

jQuery的deferred对象详解(转)

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuery的全部ajax代码都被改写了.但是,它比较抽象,初学者很难掌握,网上的教程也不多.所以,我把自己的学习笔记整理出来了,希望对大家有用. 本文不是初级教程,针对的读者是那些已经具备

jQuery的deferred对象详解(一)

最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面阐述deferred讲的非常清楚,也让我大彻大悟,为了以后能很好的查阅,现将阮老师的文字转载过来. 一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即