jQuery_promise

合集下载

JavaScript中的Promise使用详解

JavaScript中的Promise使用详解

JavaScript中的Promise使⽤详解Promise的⽤例:执⾏规则多个远程验证超时处理远程数据请求动画将事件逻辑从应⽤逻辑中解耦消除回调函数的恐怖三⾓控制并⾏的异步操作JavaScript promise是⼀个承诺将在未来返回值的对象。

是具有良好定义的⾏为的数据对象。

promise有三种可能的状态:1. Pending(待定)2. Rejected(拒绝)3. Resolved(已完成)⼀个已经拒绝或者完成的承诺属于已经解决的。

⼀个承诺只能从待定状态变成已经解决的状态。

之后,承诺的状态就不变了。

承诺可以在它对应的处理完成之后很久还存在。

也就是说,我们可以多次取得处理结果。

我们通过调⽤promise.then()来取得结果,这个函数⼀直到承诺对应的处理结束才会返回。

我们可以灵活的串联起⼀堆承诺。

这些串联起来的“then”函数应该返回⼀个新的承诺或者最早的那个承诺。

通过这个样式,我们可以像写同步代码⼀样来写⾮同步代码。

主要是通过组合承诺来实现:堆栈式任务:多处散落在代码中的,对应同⼀个承诺。

并⾏任务:多个承诺返回同⼀个承诺。

串⾏任务:⼀个承诺,然后接着执⾏另⼀个承诺。

上⾯⼏种的组合。

为什么要这么⿇烦?只⽤基本的回调函数不⾏吗?回调函数的问题回调函数适合简单的重复性事件,例如根据点击来让⼀个表单有效,或者保存⼀个REST调⽤的结果。

回调函数还会使代码形成⼀个链,⼀个回调函数调⽤⼀个REST函数,并为REST函数设置⼀个新的回调函数,这个新的回调函数再调⽤另⼀个REST函数,依此类推。

代码的横向增长⼤于纵向的增长。

回调函数看起来很简单,直到我们需要⼀个结果,⽽且是⽴刻就要,马上就⽤在下⼀⾏的计算中。

'use strict';var i = 0;function log(data) {console.log('%d %s', ++i, data); };function validate() {log("Wait for it ...");// Sequence of four Long-running async activitiessetTimeout(function () {log('result first');setTimeout(function () {log('result second');setTimeout(function () {log('result third');setTimeout(function () {log('result fourth')}, 1000);}, 1000);}, 1000);}, 1000);};validate();我使⽤timeout来模拟异步操作。

javascript promise的用法

javascript promise的用法

javascript promise的用法一、前言Promise 是 JavaScript 中的一个重要概念,它是一种异步编程解决方案。

在 ES6 中引入了 Promise,可以更方便、更优雅地控制异步程序的执行顺序,以及有效避免回调地狱的问题。

本文将详细介绍 Promise 的基本用法。

二、Promise 的基本概念Promise 是一个对象,用来表示异步操作的最终完成(或失败)及其结果。

Promise 的主要状态如下:- pending(进行中):Promise 对象创建后的初始状态。

- fulfilled(已完成):异步操作成功完成时的状态。

- rejected(已拒绝):异步操作失败时的状态。

Promise 的实例有以下三个方法:- then():当异步操作成功完成时调用,接收一个参数,即异步操作的结果。

- catch():当异步操作失败时调用,接收一个参数,即失败的原因。

- finally():当异步操作完成时(无论成功或失败)执行,不接收任何参数。

三、Promise 的基本用法1. Promise 的创建Promise 可以通过 new Promise() 来创建,它是一个构造函数,接收一个执行器函数作为参数。

执行器函数接收两个函数作为参数:resolve 和 reject,分别表示异步操作成功完成和失败。

```javascriptconst promise = new Promise((resolve, reject) => {// 异步操作代码const isSuccess = true;if (isSuccess) {resolve('操作成功!');} else {reject('操作失败!');}})```执行器函数中包含异步操作的代码,代码中需要判断异步操作的结果,如果成功就调用 resolve,并传递操作结果作为参数;如果失败就调用 reject,并传递失败原因作为参数。

promise的状态和方法

promise的状态和方法

promise的状态和方法宝子,今天咱们来唠唠JavaScript里的Promise呀。

一、Promise的状态。

Promise呢,有三种状态,就像一个人的不同心情一样。

第一种状态是“pending”,这个时候呀,就像是事情还在进行中,处在一个未完成的状态。

比如说你在网上订了个超酷的小玩意儿,快递还在路上,这时候这个订单的状态就类似“pending”。

然后呢,有“fulfilled”状态,这就好比你收到了快递,东西完好无损,超级开心,事情圆满完成啦。

在Promise里,这就是操作成功后的状态。

还有“rejected”状态,这可就有点糟糕啦,就像你订的快递丢了或者东西坏了。

在Promise里就是操作失败了,比如说请求数据的时候出了错,就会变成这个状态。

而且呀,Promise的状态一旦确定了,就不会再改变了,就像你一旦打开快递发现东西坏了,这个结果就不会再变成东西是好的啦。

二、Promise的方法。

Promise有好多超有趣的方法呢。

“then”方法是个小明星。

当Promise处于“fulfilled”状态的时候,“then”方法就会被调用。

你可以把它想象成是你收到快递后要做的事情,比如说你收到了新衣服,你就会想着试穿一下,这个试穿的动作就可以放在“then”方法里。

还有“catch”方法,这个就专门对付“rejected”状态啦。

就像你发现快递有问题,你要找客服解决一样。

如果Promise操作失败了,“catch”方法就会捕捉到这个错误,然后你可以在这个方法里面写一些处理错误的代码,比如给用户显示一个友好的错误提示。

另外呢,“finally”方法也很贴心。

不管Promise是成功还是失败,“finally”方法都会被执行。

就像不管快递来的过程顺利不顺利,你最后都要把快递盒子扔掉一样。

这个方法可以用来做一些清理工作,比如关闭网络请求之类的。

宝子,这么一说,是不是觉得Promise也没那么难理解啦?就把它当成生活里的一些小事情的处理流程就好啦。

js中的promise方法

js中的promise方法

js中的promise方法JavaScript中的Promise方法已成为现代Web开发中的一个重要组成部分。

使用Promise方法可以简化异步编程,避免回调深度嵌套和更好地处理错误。

本文将向读者详细介绍Promise方法的定义、用法、优势和注意事项,并提供示例代码以帮助读者更好地理解Promise方法。

1. Promise方法的定义Promise是一种带有状态的JavaScript对象,它表示一个异步操作的最终完成或失败,并且可以返回一个值或一个错误原因。

Promise有以下三个状态:- pending(待定):初始状态,在完成或失败之前保持着。

- fulfilled(已完成):意味着操作成功完成,并返回了一个值。

- rejected(已拒绝):意味着操作失败了,并返回了一个错误原因。

Promise方法通常使用异步函数或异步操作来创建。

Promise方法提供了一种处理异步请求的基础结构,可以在需要时预处理请求并随时获取结果。

2. Promise方法的用法使用Promise方法可以避免回调深度嵌套,更好地处理错误,并使异步代码更加易于阅读和维护。

通常,我们使用一个Promise对象来包装一个异步操作,并将它们链接在一起,以便在完成操作后执行其他操作,例如更新UI 或重新加载数据。

2.1.创建Promise对象Promise对象可以使用以下语法创建:``` let myPromise = new Promise((resolve, reject) => { // 执行异步操作 if (/* 操作成功 */) { resolve('成功返回的数据'); } else { reject('错误原因'); } }); ```在创建Promise对象时,需要提供一个执行异步操作的函数,该函数需要提供两个参数:resolve和reject。

如果异步操作成功,则调用resolve函数返回结果;如果失败,则调用reject函数并传递错误信息。

JavaScript中的Promise详解

JavaScript中的Promise详解

JavaScript中的Promise详解⽬录Promise的基本⽤法:1、创建Promise对象2、Promise ⽅法总结Promise是异步编程的⼀种解决⽅案,是⼀个对象,可以获取异步操作的消息,⼤⼤改善了异步编程的困难,避免了回调地狱,⽐传统的解决⽅案回调函数和事件更合理和更强⼤。

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

提供了⼀个统⼀的API,各种异步操作都可以⽤同样的⽅法进⾏处理1、Promise的实例有三个状态:(1)Pending(进⾏中)(2)Resolved(已完成)(3)Rejected (已拒绝)2、Promise的实例有两个过程(1)pending > fulfiled :Resolved(2)pending > rejected :Rejected注意:⼀旦从进销项状态变为其他状态就永远不能更改状态了Promise的基本⽤法:1、创建Promise对象Promise 对象代表⼀个异步操作,有三种状态:pending(进⾏中)、fulfilled(已成功)、rejected(已失败)Promise构造函数接收⼀个函数作为参数,该函数的两个参数分别是 resolve 和 reject2、Promise ⽅法Promise有五个常⽤⽅法:(1)then()then ⽅法可以接收两个回调函数作为参数,第⼀个回调函数是Promise对象的状态改变为 resoved 是调⽤,第⼆个回调函数是Promise 对象的状态变为 rejected 时调⽤。

其中第⼆个参数可以省略。

let promise = new Promise((resolve,reject)=>{ajax('first').success(function(res){resolve(res);})})promise.then(res=>{return new Promise((resovle,reject)=>{ajax('second').success(function(res){resolve(res)})})}).then(res=>{return new Promise((resovle,reject)=>{ajax('second').success(function(res){resolve(res)})})}).then(res=>{})该⽅法相当于 then ⽅法的第⼆个参数,指向 reject 的回调函数。

js中promise的使用与理解

js中promise的使用与理解

js中promise的使用与理解Promise 是一种使用广泛的异步编程解决方案,它可以让你处理回调的复杂性,减少代码的阅读难度,最重要的是可以保证回调的顺序执行一、什么是promisePromise 是 ES2015 推出的一个新的概念,它可以让异步操作以同步的方式来编写,它的核心是一个代理对象,它保存着一个异步任务的状态,可以取消,等待结果,轮询状态等等。

二、promise的优点1、避免回调地狱:使用promise可以把回调函数一层层嵌套,变成代码块。

这样就减少了代码的嵌套深度,简化了代码的阅读,有利于异步编程思维的形成,是最大的优点。

2、代码的可读性:promise使得异步编程的代码更紧凑,也更有可读性,更加容易排错和查找问题。

3、代码的弹性性:promise 支持多个回调函数,在状态改变时可以触发多个回调函数,让异步编程更加自由。

三、如何使用promise1、实例化promise 用 new 关键字来实例化promise,构造函数接受一个函数,这个函数需要2个参数: resolve、reject,可以在函数中写逻辑判断,来决定promise成功还是失败,并且在实例化的时候只能使用一次 resolve 或 reject。

2、 then 方法 then 方法接收2个参数:onResolved onRejected,他们都是一个函数,分别是Promise成功时和失败时各自执行的回调函数,也可以接受一个参数来进行传参3、 catch 方法 catch 方法接收一个函数作为参数,这个函数是Promise 失败时执行的回调函数,一般用来捕获异常,可以接受一个参数来进行传参4、 all方法 all 方法接受一个promise实例组成的数组作为参数,所有promise实例都执行resolve了,all方法才会返回。

5、 race 方法 race 方法接受一个promise实例组成的数组作为参数,只要有一个promise实例执行resolve了,race方法就会返回。

promise的五个方法

promise的五个方法

promise的五个方法Promise是JavaScript中一种异步编程的解决方案,可以避免回调地狱,让代码更加可读、易于维护。

Promise有五个方法,本文将分别介绍它们的作用和用法。

1. Promise.resolve()Promise.resolve()方法返回一个已经resolve的Promise对象。

如果传入的是一个Promise,则直接返回该Promise;如果传入的是一个thenable对象,则先将其转化为Promise再返回。

语法:Promise.resolve(value);参数:value:可以是Promise对象、thenable对象或任意其他值。

示例:```javascriptconst p1 = Promise.resolve('hello');console.log(p1); // Promise { 'hello' }const p2 = Promise.resolve(p1);console.log(p2); // Promise { 'hello' }const p3 = Promise.resolve(new Promise((resolve, reject) => {setTimeout(() => {resolve('world');}, 1000);}));console.log(p3); // Promise { 'world' }```2. Promise.reject()Promise.reject()方法返回一个已经reject的Promise对象。

语法:Promise.reject(reason);参数:reason:rejection的原因,可以是任意值。

示例:```javascriptconst p = Promise.reject(new Error('error'));p.catch(error => {console.log(error); // Error: error});```3. Promise.prototype.then()Promise.prototype.then()方法用于为Promise实例添加成功和失败的回调函数。

promise的用法归纳总结

promise的用法归纳总结

promise的用法归纳总结Promise是JavaScript中的一个重要概念,它是一种用于异步编程的解决方案。

在JavaScript中,很多操作都是异步的,例如网络请求、文件读写等等。

而使用Promise可以更好地处理这些异步操作,避免了回调函数嵌套过多、代码难以维护等问题。

本文将对Promise的用法进行归纳总结。

一、Promise的基本概念1.1 Promise的定义Promise是JavaScript中一种异步编程解决方案,它提供了一种统一的接口来处理异步操作。

1.2 Promise的特点(1)状态不受外界影响:Promise有三种状态(Pending、Fulfilled、Rejected),只有异步操作结果可以改变状态。

(2)一旦状态改变就不会再变:Promise状态一旦改变就永久保持该状态,不会再次改变。

(3)支持链式调用:Promise可以通过then方法实现链式调用,使得代码更加简洁清晰。

二、创建Promise对象2.1 Promise构造函数创建一个Promise对象需要使用Promise构造函数,并传入一个执行器函数作为参数。

```let promise = new Promise((resolve, reject) => {// 执行异步操作});```执行器函数接受两个参数:resolve和reject。

当异步操作成功时,调用resolve方法;当异步操作失败时,调用reject方法。

2.2 Promise.resolve和Promise.rejectPromise.resolve方法可以将一个值转换为一个已经成功的Promise对象,而Promise.reject方法可以将一个值转换为一个已经失败的Promise对象。

```let promise1 = Promise.resolve(1);let promise2 = Promise.reject(new Error('出错了'));```三、Promise的状态和结果3.1 Promise状态Promise有三种状态:Pending(进行中)、Fulfilled(已成功)和Rejected(已失败)。

promise接双宾语的用法

promise接双宾语的用法

promise接双宾语的用法题目:promise接双宾语的用法引言:在JavaScript中,Promise是一种用于处理异步操作的机制,它的设计理念是为了解决回调地狱的问题。

Promise对象可以将异步操作封装成一个可管理的、可复用的、可组合的对象,使得异步代码的处理更为简洁和可读。

本文将详细介绍Promise接受双宾语的用法,向读者展示如何在使用Promise时更灵活地处理异步操作。

一、Promise基础知识1. Promise的定义和基本特性2. Promise的三种状态:pending、fulfilled、rejected3. Promise的链式调用和管道处理二、Promise接受单一宾语的用法1. 使用Promise.resolve()和Promise.reject()方法2. 使用Promise.prototype.then()方法3. 使用Promise.prototype.catch()方法4. 使用Promise.prototype.finally()方法三、Promise接受双宾语的用法1. Promise.all()a. 接受一个可迭代的宾语参数b. 当所有宾语都为fulfilled状态时返回一个fulfilled状态的Promise 对象c. 当任意宾语为rejected状态时返回一个rejected状态的Promise对象2. Promise.race()a. 接受一个可迭代的宾语参数b. 当第一个宾语变为fulfilled或rejected状态时返回对应的Promise对象3. Promise.allSettled()a. 接受一个可迭代的宾语参数b. 不论宾语状态变为fulfilled还是rejected都返回一个fulfilled状态的Promise对象,Promise的数据是一个包含所有宾语状态的数组4. Promise.any()a. 接受一个可迭代的宾语参数b. 当任意一个宾语变为fulfilled状态时返回一个fulfilled状态的Promise对象c. 当所有宾语都为rejected状态时返回一个rejected状态的Promise对象四、实例分析以实际开发中的异步场景为例,分别使用Promise.all()、Promise.race()、Promise.allSettled()、Promise.any()展示它们的具体应用及使用注意事项。

js promise 的用法

js promise 的用法

js promise 的用法一、什么是PromisePromise是ES6中新增的一种异步编程解决方案,它可以更优雅地处理异步操作,避免回调地狱和多层嵌套的问题。

Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

当异步操作执行完成后,会将状态从pending变为fulfilled或rejected,并将相应的结果传递给下一个then或catch方法。

二、Promise的基本用法1.创建Promise对象使用Promise构造函数来创建一个Promise对象,其中接受一个executor函数作为参数。

executor函数接收两个参数resolve和reject,分别表示异步操作成功和失败时所调用的回调函数。

```javascriptlet promise = new Promise((resolve, reject) => {// 异步操作if (/* 异步操作成功 */) {resolve(result); // 成功时调用resolve函数并传递结果} else {reject(error); // 失败时调用reject函数并传递错误信息}});```2.使用then方法处理成功状态当异步操作执行成功后,可以使用then方法来处理成功状态。

then 方法接收两个参数onFulfilled和onRejected,分别表示异步操作成功和失败时所调用的回调函数。

```javascriptpromise.then(onFulfilled, onRejected);```3.使用catch方法处理失败状态当异步操作执行失败后,可以使用catch方法来处理失败状态。

catch 方法接收一个参数onRejected,表示异步操作失败时所调用的回调函数。

```javascriptpromise.catch(onRejected);```三、Promise的链式调用1.基本链式调用Promise对象的then方法和catch方法都返回一个新的Promise对象,因此可以使用链式调用来处理多个异步操作。

promise分类

promise分类

promise分类
Promise是JavaScript中用于异步编程的一种解决方案。

它可以分为以下几种类型:- 成功状态:表示操作成功,即异步操作已经完成,并且返回了预期的结果。

- 失败状态:表示操作失败,即异步操作未能成功完成,可能返回了错误信息或异常。

- 等待状态:初始值,不是fulfilled,也不是rejected。

Promise一旦新建就会立即执行,无法取消。

它提供了then方法用于进行链式回调,将异步操作以同步操作的流程表示出来。

Promise的状态只能改变一次,从pending转变为fulfilled或rejected后,就会一直保持这个状态,不会再发生变化。

当状态发生变化时,Promise.then绑定的函数就会被调用。

promise方法和promise实例方法

promise方法和promise实例方法

promise方法和promise实例方法Promise是JavaScript中一种处理异步操作的机制,它可以让我们更加优雅地处理异步操作,避免了回调地狱的问题。

Promise有两种方法:Promise方法和Promise实例方法。

Promise方法是指在Promise对象上定义的方法,它们是静态方法,可以直接通过Promise对象调用。

其中最常用的方法是Promise.resolve和Promise.reject。

Promise.resolve方法返回一个已经成功解决的Promise对象,而Promise.reject方法返回一个已经被拒绝的Promise对象。

这两个方法可以用来创建一个Promise对象,从而避免了手动创建Promise对象的繁琐过程。

Promise实例方法是指在Promise实例上定义的方法,它们是动态方法,只能通过Promise实例调用。

其中最常用的方法是then和catch。

then方法用于处理Promise对象的成功状态,它接受两个参数:一个是成功回调函数,另一个是失败回调函数。

当Promise对象成功解决时,then方法会调用成功回调函数;当Promise对象被拒绝时,then方法会调用失败回调函数。

catch方法用于处理Promise对象的拒绝状态,它接受一个参数,即拒绝回调函数。

当Promise对象被拒绝时,catch方法会调用拒绝回调函数。

除了then和catch方法,Promise实例还有其他一些方法,比如finally方法。

finally方法用于在Promise对象无论是成功还是被拒绝时都执行一些操作,比如关闭文件或释放资源等。

finally方法接受一个回调函数作为参数,该回调函数会在Promise对象被解决或被拒绝时都会被调用。

总之,Promise方法和Promise实例方法是Promise机制中非常重要的两个部分。

Promise方法用于创建Promise对象,而Promise实例方法用于处理Promise对象的状态。

PromiseA+规范

PromiseA+规范

PromiseA+规范1.1.1 Promise/A+规范规范出现的原因1、我们不知道异步请求什么时候返回数据,所以我们就需要些回调函数。

但是在某些情况下我们需要知道数据是在什么时候返回的,然后进⾏⼀些处理。

2、当我们在异步回调⾥⾯处理的操作还是异步操作的时候,这样就形成了异步回调的嵌套3、正是为了杜绝以上两种情况的出现,社区出现了Promise/a+规范规范的内容是什么1、不管进⾏什么操作都返回⼀个promise对象,这个对象⾥⾯会有⼀些属性和⽅法(这个效果类似于jquery中的链式编程,返回⾃⼰本⾝)2、这个promise有三种状态Unfulfilled(未完成,初始状态)Fulfilled(已完成)Failed(失败、拒绝)3、这个promise对象的使⽤时通过then⽅法进⾏的调⽤Promise的实现因为他只是⼀个规范,所以在不同的框架或者平台下有不同的实现Angular:$q服务Node:q模块,co,thenEs6:Promise, yieldEs7:async await怎么对promise对象的状态进⾏改变那?1、通过$q服务的deffer⽅法定义出来⼀个延迟对象。

2、这个延迟对象都有三个⽅法(1) resolved⽅法:当数据请求成功的时候调⽤,参数是成功返回的数据对象,把promise对象Unfulfilled状态改为fulfilled状态。

(2) rejected⽅法:当数据请求失败的时候调⽤,参数是失败的原因,把promise对象Unfulfilled状态改为failed状态。

(3)怎么知道在promise中调⽤哪个回调函数那,就是通过promise对象的状态进⾏判断的。

Promise/A+规范简介Promise/A+规范表现形式:1、可以通过链式编程的⽅式对异步操作进⾏同步处理2、上⼀个操作的输出值是下⼀个操作的输⼊值$http配合$q的使⽤在controller中使⽤1.1.2 $q服务$q服务的使⽤:$q服务使⽤步骤:1、⾸先要⼦啊factoruy中注⼊$q服务2、在Factory中使⽤如下图3、在controller中使⽤4、把异步变为同步的操作,上⼀个操作的输⼊时下⼀个操作的输⼊。

Promise实现原理(附源码)

Promise实现原理(附源码)

Promise实现原理(附源码)1.回调函数:回调函数是指在一些操作完成后执行的函数,用于处理异步操作的结果。

在Promise中,回调函数被称为处理函数(handler function),它有两个参数,分别表示成功和失败的结果。

当异步操作成功完成时,会调用成功处理函数;当异步操作发生错误时,会调用失败处理函数。

2.状态转换:Promise具有三种状态:Pending(进行中)、Fulfilled(已成功)和Rejected(已失败)。

Promise对象初始化时的状态为Pending,当异步操作执行成功后,状态变为Fulfilled;当异步操作发生错误时,状态变为Rejected。

只有在Pending状态下,Promise对象才能进行状态转换,一旦状态转换为Fulfilled或Rejected,就无法再次转换。

3.异步任务处理:Promise中的异步任务通过事件循环机制来处理。

事件循环是一种将异步任务按照特定顺序执行的机制,它由三个部分组成:宏任务队列(macrotask queue)、微任务队列(microtask queue)和渲染队列(render queue)。

- 宏任务队列:所有的异步任务(如setTimeout、setInterval等)都会被放入宏任务队列中,宏任务通常是按照FIFO(先进先出)的顺序执行。

- 微任务队列:Promise中的then和catch方法是微任务,它们会被放入微任务队列中,微任务通常是在当前宏任务执行完毕之后立即执行。

- 渲染队列:渲染队列主要用于处理Web页面渲染相关的任务,如页面重绘、重排等。

在事件循环中,先执行完当前宏任务队列中的任务,如果有微任务队列中的任务,则执行完所有微任务队列中的任务,然后再执行下一个宏任务,如此循环。

4. Promise状态转换过程:Promise的状态转换是通过resolve和reject两个方法实现的。

当异步操作成功完成时,调用resolve方法,将Promise对象的状态从Pending转换为Fulfilled,并传递成功的结果;当异步操作发生错误时,调用reject方法,将Promise对象的状态从Pending转换为Rejected,并传递失败的结果。

Promise的详解优缺点举例子

Promise的详解优缺点举例子

Promise的详解优缺点举例⼦Promise 的详解优缺点举例⼦⾸先说明这个⼤部分是抄的,因为这个我也是在学,所以是肯定的,哈哈哈。

但是能抄让别⼈更理解,那就是抄的真他妈棒这个promise⼀般接触就是在请求的时候,返回值的相应操作,回调展⽰,处理相应的信息介绍:0、是个异步的操作对象(对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)1、主要⽤于异步计算2、可以将异步操作队列化,按照期望的顺序执⾏,返回符合预期的结果3、可以在对象之间传递和操作promise,帮助我们处理队列优缺点:---Promise 优点:有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

此外,Promise 对象提供统⼀的接⼝,使得控制异步操作更加容易。

---Promise 缺点:⾸先,⽆法取消 Promise,⼀旦新建它就会⽴即执⾏,⽆法中途取消。

其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。

第三,当处于 Pending 状态时,⽆法得知⽬前进展到哪⼀个阶段(刚刚开始还是即将完成)。

异步操作的常见语法事件监听:document.getElementById('#start').addEventListener('click', start, false);function start() {// 响应事件,进⾏相应的操作}// jquery on 监听$('#start').on('click', start)⽅法回调:// ⽐较常见的有ajax$.ajax('/', {success (res) {// 这⾥可以监听res返回的数据做回调逻辑的处理}})// 或者在页⾯加载完毕后回调$(function() {// 页⾯结构加载完成,做回调逻辑处理})这样操作有啥不好、1.之前处理异步是通过纯粹的回调函数的形式进⾏处理2.很容易进⼊到回调地狱中,剥夺了函数return的能⼒3.问题可以解决,但是难以读懂,维护困难4.稍有不慎就会踏⼊回调地狱 - 嵌套层次深,不好维护有些情况需要多次调⽤服务器API,就会形成⼀个链式调⽤,⽐如为了完成⼀个功能,我们需要调⽤API1、API2、API3,依次按照顺序进⾏调⽤,这个时候就会出现回调地狱的问题API3,依次按照顺序进⾏调⽤,这个时候就会出现回调地狱的问题详解使⽤Promise:new Promise(function (resolve, reject) {// ⼀段耗时的异步操作resolve('成功') // 数据处理完成// reject('失败') // 数据处理出错}).then((res) => {console.log(res)}, // 成功(err) => {console.log(err)} // 失败)1、resolve作⽤是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调⽤,并将异步操作的结果,作为参数传递出去;2、reject作⽤是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调⽤,并将异步操作报出的错误,作为参数传递出去。

关于Promise的一些简单理解

关于Promise的一些简单理解

关于Promise的⼀些简单理解⼀、ES6 中的 Promise1、JS 如何解决异步问题?(1)什么是同步、异步? 同步指的是需要等待前⼀个处理完成,才会进⾏下⼀个处理。

异步指的是不需要等待前⼀个处理完成,就可以进⾏下⼀个处理。

(2)JS 是单线程还是多线程的? JS 是单线程的,也即执⾏处理时采⽤同步机制。

⽽ JS 实现异步是借助浏览器的多线程机制完成的。

JS 作为浏览器的脚本语⾔,其根本⽬的是实现⽤户与浏览器进⾏交互,假如现在⽤户需要删除⼀个节点 A,但同时⼜向节点 A 中添加节点时,若 JS 为多线程,则⼀个线程⽤于删除,⼀个线程⽤于添加,那此时浏览器应该以哪个线程为准,这就涉及到了复杂的同步问题。

⽽ JS 若为单线程,则按实际顺序执⾏即可,不必担⼼线程之间的冲突。

(3)JS 如何解决同步、异步问题? JS 是单线程的,也即意味着下⼀个任务需要等待上⼀个任务完成后才会去处理,如果上⼀个任务执⾏时间⾮常长,那么将会陷⼊长时间等待,此⽅式肯定不可取。

那么可以将需要长时间处理或者不需要⽴即处理的任务抽取出来,等待其处理完成后再去执⾏,从⽽使 JS 可以继续处理下⼀个任务。

也即异步处理。

JS 是借助浏览器的多线程机制去实现异步处理。

【实现异步⼤致流程:】Step1:将 JS 执⾏过程视为主线程,也即同步执⾏ JS 中的代码。

Step2:主线程执⾏过程中,若发现了异步任务,则将其交给浏览器(浏览器创建多个线程),继续进⾏下⼀步处理。

且维护⼀个异步任务结果队列(回调函数队列),异步任务完成后,向异步任务结果队列中放置⼀个事件(即回调函数)。

Step3:主线程执⾏完所有的同步代码后,开始监听回调函数队列,若发现某个回调函数状态已完成,则执⾏该回调函数。

2、什么是 Promise?(1)简单理解? Promise 是异步编程的⼀种解决⽅案。

可以理解为⼀个容器,⾥⾯保存着未来才会结束的某个操作(异步操作)的结果,通过 Promise 对象可以获取异步操作的结果。

Promise原理详解

Promise原理详解

Promise原理详解参考⽂章:、从中我们已经了解到Promise的基本⽤法。

那么现在给你⼀个需求:根据Promise的⽤法和规范,实现⼀个⾃⼰的Promise函数。

1、Promise构造函数的结构根据Promise的⽤法我们知道:在new⼀个Promise函数的时候,Promise函数必须接受⼀个函数作为参数。

我们暂且把这个参数函数称为执⾏器。

执⾏器提供两个参数(resolve,reject),且内部有状态机制(pending,resolved,rejected)。

Promise构造函数的原型上有then⽅法。

我们再来看⼀下PromiseA+标准中是怎样规定的:1. Promise对象初始状态为Pending,在被resolve或reject时,状态变为Fulfilled或Rejected2. resolve接收成功的数据,reject接收失败或错误的数据3. Promise对象必须有⼀个then⽅法,且只接受两个函数参数onFulfilled、onRejected由以上标准就容易就能实现这个类的⼤致结构。

开始撸:var PENDING = 'pending',RESOLVED = 'resolved',REJECTED = 'rejected',function Promise(executor) {//养成良好的编程习惯,先对参数做⼀个容错处理if (executor && typeof executor != 'function') {throw new Error('Promise is not a function');}let _this = this;//缓存this_this.status = PENDING;//当前Promise的状态_this.value = undefined;//Promise成功执⾏时要传递给回调的数据,默认为undefined_this.reason = undefined;//Promise失败执⾏时传递给毁掉的原因,默认为undefinedfunction resolve(value) { //内置⼀个resolve⽅法if (_this.status == PENDING) {_this.status = RESOLVED;//当调⽤resolve时,将Promise的状态改为resoled_this.value = value;//保存成功调⽤时传递进来的数据}}function reject(reason) {if (_this.status == PENDING) {_this.status = REJECTED;//当调⽤reject时,将Promise的状态改为rejected_this.reason = reason;//保存失败调⽤时传递进来的原因}}executor(resolve,reject);}//then⽅法可以接受两个函数参数,分别表⽰当前Promise执⾏成功时的调⽤onFulfilled和执⾏失败时调⽤onRejectedPromise.prototype.then = function(onFulfilled,onRejected) {let _this = this,//缓存this,保不齐后⾯会⽤到,当然如果你不想缓存this,也可以在后⾯使⽤箭头函数if (_this.status == RESOLVED) {onFulfilled(_this.value);}if (_this.status == REJECTED) {onFulfilled(_this.reason);}}看起来不错,但回调函数是⽴即执⾏的,也就是说上⾯实现的Promise只⽀持同步代码,⽽⽆法进⾏异步操作,⽐如这样是不⾏的let p = new Promise(function(resolve, reject){setTimeout(function(){resolve('成功执⾏了!');}, 1000)})p.then(function(data){console.log('成功', data)},function(err){console.log('失败', err)})// 不会输出任何代码原因是:我们在then函数中只对成功态和失败态进⾏了判断,⽽实例被new时,执⾏器中的代码会⽴即执⾏,但setTimeout中的代码将稍后执⾏,也就是说,then⽅法执⾏时,Promise的状态没有被改变依然是pending态。

promise函数执行顺序

promise函数执行顺序

promise函数执行顺序在JavaScript中,Promise是一种异步编程的重要机制,允许开发者更便捷地处理异步操作。

Promise函数的执行顺序很关键,对程序的运行结果有着重要的影响。

下面我们来看一下Promise函数执行的具体顺序。

Promise函数的执行顺序涉及到Promise的三个状态:Pending、Fulfilled和Rejected。

当一个Promise函数被执行时,会先进入Pending状态。

如果Promise函数的结果是成功的,那么它会进入Fulfilled状态,否则会进入Rejected状态。

在Promise函数的执行过程中,我们可以使用then()方法来指定Promise函数执行完毕后的处理逻辑。

当Promise函数进入Fulfilled状态时,then()方法中的回调函数就会被执行。

如果Promise函数进入Rejected状态,那么它会调用catch()方法来处理错误。

下面是Promise函数执行的具体过程:1. 创建一个Promise对象,并将其状态设置为Pending。

2. 执行Promise函数,当它执行完毕后,将Promise对象的状态设置为Fulfilled或Rejected。

3. 如果Promise对象的状态是Fulfilled,那么它将调用then()方法中的回调函数,处理Promise函数执行成功后的逻辑。

4. 如果Promise对象的状态是Rejected,那么它将调用catch()方法中的回调函数,处理Promise函数执行失败后的逻辑。

需要注意的是,Promise函数执行的顺序是异步的,即Promise 函数会在主线程之外执行,所以它不会阻塞程序的运行。

而且Promise 函数的执行结果也是异步返回的,所以我们需要使用then()或catch()方法来处理Promise函数的执行结果。

总之,Promise函数的执行顺序对于程序的运行结果有着重要的影响。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


We use a Deferred to convert such call into a Promise!


then

Deferred Functionality

All as in Promise

then(), done(), fail() , always()

Additional

ห้องสมุดไป่ตู้
resolve()
when(promise(request)) .done(function(data){ console.log(JSON.stringify(data[0])); });

With the same use:

Example Coding

get some JSON objects load Google Visualization API when all is ready, plot charts

initiates success initiates failure

reject()

Typical Callback with Promise

Or shorter

function promise(request) { return $.Deferred(function(deferred){ request(deferred.resolve); }).promise(); }

jQuery Mobile

iPhone, Android
jQuery Goals

unifying programming for common browsers removing browser deficiencies, bugs consistent access and manipulation of DOM chained calls sets of DOM elements simplified JavaScript simple consistent communication with the server simplifying asynchronous callbacks
var node = $('#id'); var properties = { width:node.width(), height:node.height(), text:node.html() };

Properties

Creating New DOM

create a tag, fill in attributes, append it

$.ajax(), $.get(), $.getJSON()

all return Promise

jqXHR object is a Promise You can make your own Promises

Typical Callback into Promise

Problem:

Many APIs offer asynchronous calls with a callback function

JSON, XML, HTML, text files no page refresh – dynamic, partial page update based upon user events parallel requests

it is "asynchronous",



$.ajax('/~janst/data.txt',{ success: function(data){ alert('data:' + data); } });

deferred / promise
Workflow

find set of Dom elements

an array

do something with / to each DOM element jQuery function


finds a set, or is applied to the set with parameters

same as


or

Looping through DOM

Make all elements of the same class clickable

$('.clickable').click(function(){ alert('aloha'); });

Or, if the it's not that simple

changes all elements in the set in the same way returns a set returns properties of the set

without parameters


Since a set is returned and function are applied to a set, calls can be chained

good example of a closure

Communication with Server

AJAX (Asynchronous JavaScript and XML) communicates with server via XMLHttpRequest object can send or receive a variety of formats
called when success

done()


fail()

called on error
called whether success or failure pipe(), isResolved(), isRejected()

always()


other (deprecated)

Predefined Promises

documentation is adequate, but could be better (examples)


standard for web development small

minified jQueryUI


Additional libraries

UI across browsers

e.g. request(callback) with request(function(data){ console.log(JSON.stringify(data)); }); function promise(request) { var deferred = $.Deferred(); request(deferred.resolve); return deferred.promise(); } when(promise(request)) .done(function(data){ console.log(JSON.stringify(data[0])); });

very succinct code
Example

Chained calls

$('#id').html('text').addClass('wrapper') .width(200).height(400) .css({top:'20px', margin:'auto'}) .click(function(){ alert('aloha'); });


$.get() returns a promise
promises can be chained Promise is a subset of Deferred watch out: data1[0], data2[0]
Promise Functionality

then()

to be called after success

$('<div>').attr({id:'row'}) .addClass('wrapper').appendTo($('body'));
$('<div>').appendTo($('body')) .attr({id:'row'}).addClass('wrapper'); $('body').append($('<div>').attr({id:'row'}) .addClass('wrapper'));

$'.clickable').each(function(i, clickable){ clickable.click(function(){ alert(i == 0 ? 'aloha' : 'hi'); }); }); each inner function click has access to its own i its outer (anynomous) function
Jquery and Promise
ICS 665 Jan Stelovsky
相关文档
最新文档