记录一下es6的promise的基本用法

es6出来了很多好用的新语法,promise算是比较火的。

promise是解决异步编程的一种方案。。。啥意思呢,我理解的是:

执行异步代码的时候(回调函数,接口请求等),你不知道他们什么时候会返回,所以你需要在他们的回调中写需要走的逻辑。当你在第一层异步调用后用返回回来的数据去再次异步,就像俄罗斯套娃一样一层一层的嵌套下去(不是说所有的场景,只是某些需要嵌套调用的场景)。

这样功能上肯定是没有什么问题的,但是代码就不好阅读和维护。

promise可以解决嵌套,让你的代码看上去就像是同步的一样(只是看上去,本质还是异步)。

1、首先我们new 一个promise对象

var p1 = new Promise(function (resolve,reject) {
    setTimeout(() => {
        console.info(‘我是p1中运行的代码‘);
        resolve(‘我在p1中的then中执行‘)
    }, 1000)
});

p1.then(function (data) {
    console.info(data);
},function(err){});

代码可以直接copy到console中运行,1秒后输出‘我是p1中运行的代码’ 紧接着输出‘我在p1中的then中执行’两行文字。

从代码结构上来看,是同步代码的编写方式,并没有嵌套callback,但是then中的方法是在promise中的方法调用后被运行的。

promise中的参数是一个function,并且直接被运行了。

new一个promise对象需要传入一个方法作为参数,该方法有两个参数,resolve和reject。

resolve函数的作用是,当Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去(一般我会理解为当promise中的异步执行成功时,执行的方法,这样初学会比较好理解(并不准确),promise的原理其实是通过状态变化来控制调用resolve还是reject)。
reject函数的作用是,当Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

2、修改then的调用时间

var p1 = new Promise(function (resolve,reject) {
    setTimeout(() => {
        console.info(‘我是p1中运行的代码‘);
        resolve(‘我在p1中的then中执行‘)
    }, 1000)
});
setTimeout(() => {
    p1.then(function (data) {
        console.info(data);
    },function(err){});
}, 2000)

观察一下和上面的代码有什么不同(then在2秒后被调用,promise在1秒后被调用)。执行promise的时候并没有马上去执行then中的方法。当2秒后调用then的时候返回了异步调用的结果(就好像把异步结果存起来,当你需要使用它的时候再拿出来一样)。要理解这个,就需要理解promise的状态变化。(下次我会记录一篇promise的简单实现)。

3、then中返回Promise对象

var p1 = new Promise(function (resolve,reject) {
    setTimeout(() => {
        console.info(‘我是p1中运行的代码‘);
        resolve(‘我在p1中的then中执行‘);

    }, 1000)
});
p1.then(function (data) {
    console.info(data);
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            console.info(‘我是嵌套的promise‘);
            resolve(‘我是嵌套的promise中的then‘);
        })

    });
}, function (err) {}).then(function (data) {
    console.info(data);
}, function (err) {});

promise的链式调用是使用then来实现的,对于多层嵌套的ajax,就非常好用了。

4、配合ajax使用

var p1 = new Promise(function (resolve,reject) {
    $.ajax({
        url: url,
        method: ‘get‘,
        success: function (data) {
            resolve(data);
        },
        error: function (xhr, statusText) {
            reject(statusText);
        }
    });
});
p1.then(function (data) {
    console.info(data);
    return new Promise(function (resolve, reject) {
        $.ajax({
            url: url,
            method: ‘get‘,
            success: function (data) {
                resolve(data);
            },
            error: function (xhr, statusText) {
                reject(statusText);
            }
        });

    });
}, function (err) {}).then(function (data) {
    console.info(data);
}, function (err) {});

这些只是promise的最基本的用法,当然它还有catch,all,race等其他方法。

原文地址:https://www.cnblogs.com/panyujun/p/9255330.html

时间: 2024-10-30 00:55:17

记录一下es6的promise的基本用法的相关文章

ES6之Promise用法详解

一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what.那么什么是Promise呢? 以下是MDN对Promise的定义 The Promise object is used for asynchronous computations. A Promise represents a single asynchronous operation that

ES6 - promise对象

Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ success:function(res1){ //...请求B开始,B依赖A返回的数据 $.ajax({ sucess:function(res2){ //...请求C开始,C依赖B返回的数据 $.ajax({ sucess:function(res3){ } }); } }); } }); 这种写

ES6的Promise

相信凡是写过javascript的童鞋也一定都写过回调方法(callback),简单说回调方法就是将一个方法func2作为参数传入另一个方法func1中,当func1执行到某一步或者满足某种条件的时候才执行传入的参数func2,例如下面的代码段 // 当参数a大于10且参数func2是一个方法时 执行func2 function func1(a, func2) { if (a > 10 && typeof func2 == 'function') { func2() } } func

一个简单的例子搞懂ES6之Promise

ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步是这样的: * 每当我需要执行一次异步操作的时候,我都需要new一个promise对象 * 每一个异步操作的Promise对象都需要设定一个成功执行的条件和成功的回调.一个失败的条件和失败的回调 * Promise对象可通过执行then()方法获得成功的回调信息 * Promise对象可通过执行ca

Node.js用ES6原生Promise对异步函数进行封装

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.转载请注明来源http://blog.csdn.net/azureternite 目录(?)[+] Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初始状态,即等待操作的执行 fulfilled:成功的操作 rejected:失败的操作 pending的状态

浅谈ES6原生Promise

浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游荡在JavaScript世界. 正所谓: 世界本没有回调,写的人多了,也就有了})})})})}). Promise的兴起,是因为异步方法调用中,往往会出现回调函数一环扣一环的情况.这种情况导致了回调金字塔问题的出现.不仅代码写起来费劲又不美观,而且问题复杂的时候,阅读代码的人也难以理解. 举例如下

ES6 学习 -- Promise对象

1.promise含义:可以将promise对象看成是一个容器,它保存着未来才会结束的某个事件(一般是异步操作事件)的结果,各 种异步操作都可以用promise对象来处理promise的特点:(1)promise对象有三个状态:pending(进行中).fulfilled(已成功)和rejected(已失败),只有异步操作的结果,可 以决定当前是哪一种状态,其他操作无法改变当前状态(2)一旦状态值改变,就不会再变了,任何时候都可以得到这个结果.promise对象的状态改变,只有从pending变

ES6关于Promise的用法

Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形式为: new Promise( /* executor */ function(resolve, reject) { if (/* success */) { // ...执行代码 resolve(); } else { /* fail */ // ...执行代码 reject(); } } );

利用ES6的Promise.all实现至少请求多长时间

1.背景 我们都知道ajax请求可以加个timeout,就是最多请求多少时间,如果超过这个时间直接就报错. 这个是最多请求多长时间,我现在要做的是,最少要请求多长时间,然后才能执行后续的逻辑. 比如,一个ajax请求 x 毫秒就执行完毕了,但我要让他至少执行1秒钟,那我们会这么想: ajax完成后 , 1. 如果x<1s, 那我们先setTimeout => 1s - x ,然后执行后续操作. 2 如果x>=1s, 那我们直接执行后续操作. 想想这可繁琐了,我们还要在前面记录一下开始时间