当前位置: 首页 > 编程笔记 >

javascript异步编程代码书写规范Promise学习笔记

慕容坚
2023-03-14
本文向大家介绍javascript异步编程代码书写规范Promise学习笔记,包括了javascript异步编程代码书写规范Promise学习笔记的使用技巧和注意事项,需要的朋友参考一下

最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下。

一:Promise是什么?为什么会有这个东西?

首先说明,Promise是为了解决javascript异步编程时候代码书写的方式产生的。
随着javascript的发展,异步的场景越来越多。前端有AJAX,setTimeout等,后端Node异步更多。按照传统的做法,那么就是各种回调嵌回调。代码可以把人绕晕。
这个时候,CommonJS社区提出了一个叫做Promise/A+的规范,这个规范定义了如何书写异步代码,包括使用when/then/resolve等来组织异步的代码。
这个规范由于很优雅,所以相继就有很多人实现了这个规范,其中包括 浏览器原生支持的Promise(), jQuery里面的deferred,when.js等。
因为这几个库都符合该规范,所以学习一个也就可以了。我主要学习了jQuery的deferred,所以本文主要讲讲这个实现。
 
二:jQuery的deferred

首先,关于deferred对象,阮一峰老师有篇文章写的很详细了,地址点这。建议可以先看看他的那篇文章,再继续往下看。
上面说过,promise是为了解决异步(比如ajax)的,那么我们来对比下他们的区别。
经典的jQuery的AJAX的写法是


$.ajax({

    type: "get",

    url: "",

    success: function () {},

    error; function () {}

});

其中success和error参数便是成功/失败时候的回调函数。 

而现在jQuery的AJAX写法成了


$.ajax({

    type; "get",

    url: ""

}).done(function () {}).fail(function () {});

其中成功后会调用done里面的函数,失败便会调用fail里面的函数。 

看到这里也许你就会有疑问了,done/fail这些方法是哪个对象上的?$.ajax()返回了什么对象,为什么有这两个方法?
答案就在下面介绍的Deferred对象。

jQuery提供了一种新的类型Deferred。通过$.Deferred()来生成。例如


var def = $.Deferred();

这个def继承了很多方法,有done/fail/resolve/reject等。
所以这里我们也就知道,上面$.ajax()其实返回的也就是这个对象。
 
deferred对象有很多方法,这里介绍几种常用的,更多的可以参考 API
 
首先自然是生成一个def对象。这里有很多方法,比如:


var def = $.Deferred();    // 自己生成

$.ajax({});    // ajax方法返回的也是def对象

$.when();    // when方法也会返回一个def对象

这里,$.when()可以单独讲讲,这个方法通常接收一个或多个deferred对象,然后根据这些deferred对象的状态情况,来决定$.when()返回的对象的状态。其中有个使用场景就是多个ajax请求,如果其中一个失败就都算失败,那么便可以在$.when()中传入多个ajax方法,例如$.when($.ajax(), $.ajax())。然后$.when会返回一个def对象(根据这两个请求结果的来判断)。
 
接着得到了def对象,便有了一系列改变这个对象状态的方法


def.resolve();    // 把def对象设置成已经完成,然后便会立刻执行绑定在def.done()里面的函数。

def.reject();    // 把def对象设置成已经失败,然后便会立刻执行绑定在def.fail()里面的函数。

def.notify();    // def对象执行中,对应的回调是def.progress()。

紧接着是设置回调的方法,顺序和上面的对应,也就是什么状态会调用到什么回调


def.done();    // 对应def.resolve();

def.fail();    // 对应def.reject();

def.progress();    // 对应 def.notify();

// 特殊的

def.always();    // 成功或者失败都会调用

def.then();    // 接受多个函数,按顺序依次是成功(done),失败(fail)和进行中(progress)

其实到这里位置,deferred对象的用法也就差不多了。不过jQuery还提供了几个API


// 检查当前状态类

def.isRejected();

def.isResolved();

def.state();

这几个api顾名思义,就不具体讲了,具体可以查看上面给的jQuery API文档。
 
还有一个方法,就是有时候我们希望给外部一个def对象,然后这个对象可以设置各种状态的回调,但是不能改变它的状态,那么就可以用


def.promise();

返回一个promiese对象,是deferred对象的子集,可以用done/fail等方法,没有resolve/reject等方法,主要是为了保护不让外部去修改def对象的状态。 

至此,关于promise已经全部讲完,大家现在就可以把它用在自己的项目中了,另外提早给大家拜个早年,祝大家羊年洋洋得意^ ^。

 类似资料:
  • 本文向大家介绍Dojo Javascript 编程规范 规范自己的JavaScript书写,包括了Dojo Javascript 编程规范 规范自己的JavaScript书写的使用技巧和注意事项,需要的朋友参考一下 前言 良好的JavaScript书写习惯的优点不言而喻,今天彬Go向大家推荐Dojo Javascript 编程规范,相当不错的 Javascript 编程风格规范,建议大家可以借鉴一

  • 1 前言 JavaScript 是最火的前端脚本语言(近些年因为CommonJS规范的完善和NodeJS的诞生,JavaScript使用了包和模块管理的方式,走前端开发方向的请自行去了解)。本文档的目标是使 JavaScript 代码风格保持一致,容易被理解和被维护。 虽然本文档是针对 JavaScript 设计的,但是在使用各种 JavaScript 的预编译语言时(如 TypeScript 等

  • 概述 JavaScript 层层回调的异步编程让人望而生畏。而 Promise 的诞生就是为了解决这个问题,它提供了一种 Future 模式,大大简化了异步编程的复杂性。而 Promise/A+(中文版)是一个通用的、标准化的规范,它提供了一个可互操作的 then 方法的实现定义。Promise/A+ 规范的实现有很多,它们的共同点就是都有一个标准的 then 方法,而其它的 API 则各不相同。

  • 本文向大家介绍JavaScript常用代码书写规范的超全面总结,包括了JavaScript常用代码书写规范的超全面总结的使用技巧和注意事项,需要的朋友参考一下 一、全局命名空间污染 总是将代码包裹在一个立即的函数表达式里面,形成一个独立的模块。 不推荐 推荐 二、立即执行函数 在立即执行函数里面,如果有用到全局变量应该通过变量传递的方式,让立即执行函数的函数体在调用时,能以局部变量的形式调用,在一

  • 问题内容: 承诺和生成器允许您编写异步代码。我不明白为什么在ECMA脚本6中同时引入了这两种机制。什么时候最好使用Promise?什么时候使用生成器? 问题答案: 这两种技术之间没有对立。它们共存并很好地互补。承诺使您能够获得尚不可用的异步操作的结果。它解决了厄运金字塔问题。所以代替: 你可以写: 但是即使有承诺,您也必须以异步方式编写代码- 您必须始终将回调传递给函数。编写异步代码比同步代码难得

  • 本文向大家介绍跟我学习javascript解决异步编程异常方案,包括了跟我学习javascript解决异步编程异常方案的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript异步编程的两个核心难点 异步I/O、事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络、文件访问功能,且使之在后端实现了较高的性能。然而异步风格也引来了一些麻烦,其中比较核心的问题是: 1、函数