ES6学习笔记(十四)Promise对象

JavaScript -- ES6的Promise 本文系统讲解了Promise在前端异步编程中的应用。首先分析回调函数的缺点(嵌套地狱),重点介绍Promise的实现原理:通过返回Promise对象和.then()链式调用实现异步顺序执行,并说明传参和错误处理机制。同时介绍了ES7的async/await语法糖,可消除.then()嵌套。还详细解析了Promise.all()和Promise.any()等原型方法的使用场景,通过商品查询案例演示其实际应用。最后预告将分享手写Promise的实现过程,帮助开发者深入理解异步编程原理。 阅读详情

promise是用于实现异步编程的一种解决方案,异步操作保存在promise中,在promise状态发生改变时触发对应的异步操作。

Promise的特点


  1. promise有三种状态,pending(进行中),resolve(已成功),rejected(已失败)。只有异步操作的结果才能改变promise的状态,其他操作无法改变其状态。
  2. Promise的状态转换只有两种,从pending转为resolve或者从pending转为rejected。一旦转换完成,状态就不再改变。如果状态改变已经发生了,再调用这个Promise对象,会立即返回结果。这与事件不同,事件一旦错过发生的时候,再监听该事件不会得到结果。
  3. Promise无法取消,一旦新建就会立即执行
  4. 其内部抛出的错误不会反应到外部
  5. 处于pending状态时,无法得知当前所处的状态,即离状态改变还有多“久”(刚开始进行还是即将完成)

Promise的基本用法


Promise使用Promise的构造方法来构建,该构造方法传入一个函数作为参数,传入的函数有两个参数,resolve和reject。resolve用于将状态由pending转为resolve,reject用于将pending转为rejected。

const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

resolve和reject是可以自己定义的命名,但是为了规范化代码,让别人在看你的代码时容易理解,建议使用resolve和reject。

resolve和reject中的参数将作为实例生成后then方法中的参数函数中的对应参数。

promise.then(function(value) {

  // success

}, function(error) {

  // failure

});

then方法第一个参数为异步操作成功的回调函数,即resolve,第二个参数为异步操作失败的回调函数,即rejected。

then方法的回调函数在当前脚本所有同步任务执行完后才会执行,但会在setTimeout时间为0的语句之前执行,所以下面的代码的执行顺序与代码顺序不同。

setTimeout(function(){
    console.log('setTimeout');
},0);

var pro = new Promise((resolve, reject) => {
    resolve();
    console.log('promise');
});
pro.then(function() {
    console.log('resolved');
});
console.log('out');
//promise
//out
//resolved
//setTimeout

上面的代码可以看到,promise新建时立即执行了里面的console语句,接着将当前脚本中的同步任务即全局下的console.log(‘out’)执行后才执行then里面的console语句。

Promise构造器第一个参数回调会展开thenable或真正的Promise,与Promise.resolve(...)一样(下文会介绍该方法)。

var p=new Promise((resolve,reject)=>{
    resolve(new Promise((resolve,reject)=>{
        reject('error');
    }))
})

p.then(null,(val)=>{
    console.log(val);
})

//error

可以看到,resolve直接将里面的Promise展开,因为里面使用了reject,所以将里面的'error'作为then方法第二个函数参数的参数值。因此,当使用resolve方法时并不一定就是转为完成状态,如果其参数为一个Promise或thenable,在展开后可能会变为拒绝。

而reject并不像resolve一样,reject只会将传入的Promise/thenable值原封不动地设置为拒绝理由,不会展开Promise/thenable。

var p=new Promise((resolve,reject)=>{
    reject(new Promise((resolve,reject)=>{
        resolve('resolve');
    }))
})

p.then(null,(val)=>{
    console.log(val);
})

//Promise {<resolved>: "resolve"}

可以看到reject最后并没有展开里面的Promise,而是将其整个作为拒绝理由传给了then方法。

resolve和reject函数的参数是另一个promise时当前promise的状态由参数的promise决定。

var p1 = new Promise((resolve, reject) => {
    resolve(p2);
});


var p2 = new Promise((resolve, reject) => {
    resolve('p2');
})

p1.then((value) => {
    console.log(value)
})

// p2

调用resolve和reject后接下来的语句仍会执行

var p1 = new Promise((resolve, reject) => {
    resolve('resolve');
    console.log('after');
});

p1.then((value) => {
  console.log(value)
})

// after

// resolve

为了避免这种情况,我们将resoleve放在return后

var p1 = new Promise(
  (resolve, reject) => {
    return resolve('resolve');
    console.log('after');
});

p1.then((value) => {
  console.log(value)
})

// resolve

与setTimeout的执行顺序先后


对于propmise和setTimeout来说,两者都是异步的方式,但是还是有执行的先后顺序的

var r = new Promise(function(resolve, reject){
    console.log("a");
    resolve()
});
setTimeout(()=>console.log("d"), 0)
r.then(() => console.log("c"));
console.log("b")

上面代码的执行顺序是‘a,b,c,d’,c在d之前,是因为Promise产生的是JavaScript引擎内部的微任务,而setTimeout是浏览器API,它产生宏任务。在JavaScript执行机制中,异步任务的执行优先级是先执行微任务,后执行宏任务。(准确来说是先将微任务放入到执行栈执行,待微任务为空时再去宏任务中将任务放到执行栈中执行)

具体看详解JavaScript执行机制--异步执行顺序

Promise的方法


Promise的原型方法


Promise.prototyep.then

then方法用于为Promise提供状态改变时添加对应的回调函数,其两个参数都为函数,第一个参数为Promise状态转为resolve时的回调函数,第二个参数为Promise状态转为rejected时的回调函数。该方法返回一个新的Promise实例(不是原来的Promise对象),即可以使用链式写法多次调用then方法。

getJSON("/posts.json")
.then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

多个then方法链式调用时,会等待上一个then方法返回后才执行下一个。

如果没有给then方法传递一个有效的函数作为完成处理函数参数,会有替代的默认函数参数。

var p=new Promise((resolve,reject)=>{
    resolve(1);
})

p.then(
    null
    //默认变为下列的函数参数,将接收到的传入值传给下一个Promise
    //function(val){
    //    return val;
    //}
).then((val)=>{
    console.log(val);
})

//1

我们可以看到,我们在then方法中传入了一个null,这并不是一个有效的函数参数,所以其被默认的函数参数替代,将之前的传入值“1”传入下一个Promise,最后通过console语句打印出来。同样的,then方法的第二个参数省略或者传入null,undefined会使用默认函数参数,将错误传递下去。

var p=new Promise((resolve,reject)=>{
    reject('e');
});
p.then(null,null
    //等同于
    //function(val)=>{
    //    return(val);
    //}
 ).then(null,(error)=>{
    console.error(`error: ${error}`);
})

// error: e

Promise.prototype.catch

Promise.prototype.catch(reject)可以看成是Promise.prototype.then(null,reject)或Promise.prototype.then(undefined,reject),即该方法是Promise转换状态时发生错误的回调函数,因为null和undefined为被转化为将值传到返回的Promise的默认函数参数。

const promise = new Promise(function(resolve, reject) {

  throw new Error('test');});

promise.catch(function(error) {

  console.log(error);});

// Error: test

上面代码可以看到,在Promise中抛出了一个错误,catch方法捕获了这个错误。

若Promise已经进入了resolve状态,则抛出错误不会被catch方法捕获,这是因为Promise状态只要转换成resolve或rejected就不会再变换状态的特点导致的。

const promise = new Promise(function(resolve, reject) {

  resolve('ok');

  throw new Error('test');});

promise

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

  .catch(function(error) { console.log(error) });

// ok

上面代码中,promise已经调用了resolve,所以其下面的抛出异常语句没有被catch方法捕获。

Promise对象抛出的错误如果没被捕获会传递到返回的Promise实例上,知道被捕获为止。

getJSON('/post/1.json').then(function(post) {

  return getJSON(post.commentURL);})

.then(function(comments) {

  // some code

}).catch(function(error) {

  // 处理前面三个Promise产生的错误

});

上面代码中有三个Promise对象,不管哪一个抛出异常,最后都由catch来捕获。

如果没有指定处理错误的回调函数,Promise抛出的错误不会有任何反应,不会影响到外层代码的执行。

const someAsyncThing = function() {
  return new Promise(function(resolve, reject) {
    // 下面一行会报错,因为x没有声明    
    resolve(x + 2);
  });
};

someAsyncThing().then(function() {
  console.log('everything is great');
});

setTimeout(() => { 
    console.log(123);
}, 2000);

// 123

如上面代码中虽然Promise报错了,但是外面的setTimeout方法依然可以执行。

不仅是Promise中会抛出错误,回调函数中也会抛出错误,报错catch中的函数,此时可以再用一个catch来处理抛出的错误。

someAsyncThing().then(function() {

  return someOtherAsyncThing();

}).catch(function(error) {

  console.log('oh no', error);

  // 下面一行会报错,因为y没有声明  

y + 2;})

.catch(function(error) {

  console.log('carry on', error);

});

// oh no [ReferenceError: x is not defined]

// carry on [ReferenceError: y is not defined]

Promise.prototype.finally

该方法用于执行Promise不管转换成什么状态都会执行的操作,可以类比try/catch操作中的finally。

Promise

.then(result => {···})

.catch(error => {···})

.finally(() => {···});

如上代码中,不管promise最后变为什么状态,finally后的参数函数一定会执行。

finally方法的回调函数不接受参数,这意味着无法得知当前是什么状态,所以finally用来执行与状态无关的操作,其本质为then方法的特例。其实现如下代码。

Promise.prototype.finally = function (callback) {

  let P = this.constructor;

  return this.then(

    value  => P.resolve(callback()).then(() => value),

    reason => P.resolve(callback()).then(() => { throw reason })

  );

};

finally方法最后会返回resolve或reject的参数值。

// resolve 的值是 undefined

Promise.resolve(2).then(() => {}, () => {})

// resolve 的值是 2

Promise.resolve(2).finally(() => {})

// reject 的值是 undefined

Promise.reject(3).then(() => {}, () => {})

// reject 的值是 3

Promise.reject(3).finally(() => {})

转为Promise对象的方法


Promise.resolve

该方法用于将参数转为Promise对象

Promise.resolve('foo')

// 等价于

new Promise(resolve => resolve('foo'))

由上面的等价写法我们可以看出Promise.resolve方法返回一个转换为resolve状态的Promise对象,根据其参数有四种不同的返回情况

1.参数为一个Promise实例

此时该方法会直接返回参数中的Promise实例

var p=new Promise((resolve,reject)=>{
    resolve();
})

Promise.resolve(p)===p

//true

2.参数是一个有then方法的对象

var thenObj = {
  then(resolve) {
    console.log('then');
    resolve('resolve');
  }
}

Promise.resolve(thenObj).then(value => {
  console.log(value);
})

// then

// resolve

在使用该方法将对象转为Promise对象时会立即执行该对象的then方法,所以上面代码中首先打印出’then’,然后才执行resolve的回调函数。

3.参数为一个没有then方法的对象或非对象

此时该方法返回resolve的参数为该方法参数的Promise对象

const p = Promise.resolve('Hello');

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

// Hello

4.没有参数

此时该方法直接返回一个Promise对象,由于没有参数,所以此时打印出resolve的参数只能得到undefined

var p = Promise.resolve();
p.then(function (val) {
  console.log(val);
});

// undefined

Promise.reject

该方法也接受一个参数,返回一个Promise对象,与Promise.resolve不同的是,该方法返回的Promise对象的状态为rejected。

const p = Promise.reject('出错了');

// 等同于

const p = new Promise((resolve, reject) => reject('出错了'))


p.then(null, function (s) {

  console.log(s)});

// 出错了

对于不同参数的处理,Promise.reject与Promise.resolve一样,Promise.reject参数为Promise或thenable时,会将整个Promise/thenable作为拒绝理由传给返回的Promise。

var p1=new Promise((resolve)=>{
    resolve(1);
})
var p2=Promise.reject(p1);
p2.then(null,(val)=>{
    console.log(val);
})
// Promise {<resolved>: 1}

Promise处理多个Promise的方法


Promise.all

该方法用于将多个Promise实例包装为一个新的Promise实例。

该方法接受一个数组作为参数,数组成员为Promise对象,若不是Promise对象,则先使用Promise.resolve方法变为对象。而事实上,数组参数中的每个值都会经过Promise.resolve方法的过滤。

该方法返回的Promise对象的状态由参数数组中的Promise对象决定,若数组中所有Promise对象的状态都变成已成功,则该方法返回的Promise对象的状态也变为已成功,数组中所有Promise的返回值组成一个数组传递给该方法生成的Promise对象的回调函数;若数组中有一个Promise对象状态变为已失败,则第一个变为已失败的对象的返回值传递给最后返回的Promise对象,该对象状态也变为已失败。

Promise.all([1,2,3,4]).then((val)=>{
    console.log(val);
})

// [1, 2, 3, 4]

Promise.all([p1,p2,p3,p4]).then((val)=>{
    console.log(val);
}).catch((error)=>{
    console.log(`error: ${error}`);
})
// error: 4

由上面的代码可以看到,当参数数组里面没有一个状态变为失败,会将成功的返回值作为数组成员并返回该数组,所以第一段代码返回了一个数组。而第二段代码中,因为p4是变为失败的,所以最后只将失败的值传给返回的Promise对象。

Promise.race

该方法的参数和Promise.resolve一样,不同的是,其状态由参数数组成员中率先改变的Promise对象决定,返回的Promise对象会与率先改变的Promise对象相同,率先改变的Promise对象的返回值也会传递给该方法返回的Promise对象。

var p1=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(1);
    },1000);
})

var p2=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(2);
    },2000);
})

var p3=new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(3);
    },3000);
})

Promise.race([p1,p2,p3]).then((val)=>{
    console.log(val);
})

// 1

如上代码中,p1转为成功最快,所以最后将p1中的resolve的参数作为最后返回的值。

如果参数为一个空数组,按我们上文说的,最后得到的Promise的状态是由其内率先转换的Promise决定的,因为空数组内显然没有Promise,自然更没有率先转换的Promise,所以返回Promise永远不会转换状态,也因此千万不能使用空数组作为其参数。如下面的代码就永远不会转换状态。

Promise.race([]).then((val)=>{
    console.log(val);
}).catch((error)=>{
    console.error(error);
});

如果参数数组中的成员不是Promise对象,一样会先使用Promise.resolve将其变为对象。

其他方法


Promise.try

该方法用于模拟try代码块,通过该方法可以使同步函数同步执行,异步函数异步执行。

如下面代码中,database.users.get可能会抛出同步错误也可能抛出异步错误,对应不同的错误写法如下。

//异步错误

database.users.get({id: userId})

.then(...)

.catch(...)

//同步错误

try {

  database.users.get({id: userId})

  .then(...)

  .catch(...)} catch (e) {

  // ...}

而通过使用Promise.try可以同时处理这两种错误

Promise.try(() => database.users.get({id: userId}))

  .then(...)

  .catch(...)

Promise的局限性


顺序错误处理

Promise的错误处理可以使用then方法,catch方法来处理,在对一条Promise链进行错误处理时,可能出现每个步骤都出现错误,且在每个步骤都有错误处理的方法的情况,此时我们在最后使用catch只能捕获最后的错误,而无法得到中间的错误,即中间的错误会被忽略。这有时是我们要的,但有时候又可能是我们想避免而没法避免的。

var p=new Promise((resolve,reject)=>{
    reject('e');
});
p.then(null,(val)=>{
    foo.v();// foo为未定义的变量名,所以在这里会报错
	console.log(val);
}).then(null,(val)=>{
    console.log(val);
})

//ReferenceError: foo is not defined at p.then

上面代码中,第一个错误被忽略了,这就是Promise的一个局限性。

单一值

Promise只能有一个完成值(resolve)或一个拒绝理由(reject),一般我们会通过将多个值封装到一个数组或对象来实现多个值的传递。

单决议

Promise只能被决议一次,即只能转换一次状态(变为完成状态或者拒绝状态),改变之后没法变为另一种状态,也无法变为原状态。这是Promise的本质特征,也适用于很多场景,但当我们要用于响应某种可能发生多次的激励(比如事件)时,Promise就不是很合适了,就如按钮的点击事件,除非你的按钮只能点一次,否则Promise不适合用在这种场景中。

无法取消

一旦创建了一个Promise并为其注册了完成或拒绝处理函数,且该任务因某种情况没法转换状态时,我们无法从外部停止其进程。就如给Promise.race传了一个空数组作为参数,Promise.race一直在等待某个Promise转为完成或拒绝状态,但我们都明白它永远等不到,但它也不会消失,我们也无法从外部取消它的等待。

Promise性能

使用Promise链比起使用基于回调的异步任务链进行的动作会多一些,这意味着它会稍微慢一些,但我们很难回答会慢多少。虽然这是局限性,但有时为了得到其他东西,我们可以接受这样的局限性。

Promise稍慢一些,但是作为交换,你得到的是大量内建的可信任性,对Zalgo的避免以及可组合性。

                                                                                                                                     ---------《你不知道的JavaScript 中卷》


参考自阮一峰的《ECMAScript6入门》

        Kyle Simpson的《你不知道的JavaScript 中卷》


ES6学习笔记目录(持续更新中)

 

ES6学习笔记(一)let和const

ES6学习笔记(二)参数的默认值和rest参数

ES6学习笔记(三)箭头函数简化数组函数的使用

ES6学习笔记(四)解构赋值

ES6学习笔记(五)Set结构和Map结构

ES6学习笔记(六)Iterator接口

ES6学习笔记(七)数组的扩展

ES6学习笔记(八)字符串的扩展

ES6学习笔记(九)数值的扩展

ES6学习笔记(十)对象的扩展

ES6学习笔记(十一)Symbol

ES6学习笔记(十二)Proxy代理

ES6学习笔记(十三)Reflect对象

ES6学习笔记(十四)Promise对象

ES6学习笔记(十五)Generator函数

ES6学习笔记(十六)asnyc函数

ES6学习笔记(十七)类class

ES6学习笔记(十八)尾调用优化

ES6学习笔记(十九)正则的扩展

ES6学习笔记(二十)ES Module的语法

C#教程 C# 教程 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念。 现在开始学习 C#! C# 在线工具 谁适合阅读本教程? 本教程有助于初学者理解基础的 C# 编程。在学习完本教程后,您将到达一个中级的 C# 编程水平。 阅读详情

相关推荐

不同网段共享打印机的方法

不同网段怎么共享打印机,跨路由怎么共享打印机

weixin_44686104的博客 1万+

每天10个前端小知识 【Day 12】

每天学习10个趣味前端小知识,快来看看吧!

夏天的博客 4489

ArcGIS高效拆分shp文件:无需依赖属性表的实用技巧

本文针对ArcGIS中shp文件因属性表缺失而难以拆分的问题,详细介绍了无需依赖属性表的实用技巧。核心是使用“拆分多部件要素”工具,直接根据图形结构将多个独立但被合并的部件拆分为单个要素,并提供了ArcGIS Pro和ArcMap的操作流程、关键注意事项及拆分后的属性处理方案。

n2o3p4的博客 378

使用Promise过程中resolve或reject后,后面代码还会执行

使用Promise过程中resolve或reject后,后面代码还会执行

大雾起了清晨 4697

【教程4>第4章>第12节】通过FPGA实现基于FFT变换的频偏估计和补偿

基于FFT变换的频偏估计和补偿,其基本原理如下:而频偏补偿的目的是将频偏后的信号频谱移回原来的位置。

FPGA/MATLAB学习教程/源码/项目合作开发 882

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 779

使用Promise过程中resolve或reject后,后面代码还会执行,默认加return较妥

console.log(111) p() .then(result => { console.log(`p result:${result}`) }) .catch(err => { console.log(`p err :${err}`) }) p1() .th...

cell的博客 2万+

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

学习笔记 JavaScript ES6 异步编程Promise

Promise,ES里面对异步操作的第一种方案! 学习Promise,让异常操作变得优雅~~~ Promise的精髓在于异步操作的状态管理~

白鸽同学的博客 3004

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

【CT/电镜 重建教程 1.1】层析成像的精确实空间迭代重建算法(RESIRE)

在此,我们报告了RESIRE算法的发展用于准确的断层重建。与实空间迭代算法相比,RESIRE使用傅里叶切片定理或Radon变换作为正向投影,使用线性变换作为反向投影,两者都具有高精度。与EST和GENFIRE相比,RESIRE是一种实空间迭代算法,可以在并行计算中实现快速运行时间。

2401_87064292的博客 1062

Promise和Reflect

Promise 概念 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 所`Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。 特点 对象的状态不受外界影响。 一旦状态改变,就不会再变,任何时候都可以得到这个结果。 状态 Promise对象代表一个异步操作,有三种状态: pending(进行中)、f...

qq_42164670的博客 431

CarSim仿真快速入门(十八)-CarSim2021中的混合动力和纯电动系统

CarSim和TruckSim包括用于电动汽车(BEV)和混合电动汽车(HEV)的动力总成系统。电动和混合电动系统可与所有现有驱动系统配合使用,例如:FWD,RWD,AWD和多轴驱动系统。混合动力/电动系统模型还包括电池管理控制。CarSim或TruckSim中的默认动力总成是为闭环速度控制器提供的备用动力总成。要安装和使用完整的动力总成,请从Vehicle: Assembly库或Vehicle: Lead Unit 库链接到Powertrain数据集。在“动力总成”界面上,从下拉列表控件中选择以下三个选项

小明师兄的博客 7455

es6的Promise对象详解

秋招已经进入了尾声,这两个月以来一直忙着找工作,没有时间看新东西,这几天得空将es6的Promise对象又细细的理解了一下,所以下来整理一下我对Promise对象以及用法的理解。什么是Promise?为什么要使用Promise? 当我们使用js的异步调用时通常习惯使用回调函数,这样的代码简单便于理解,但是当回调嵌套的时候就会造成代码混乱,不好梳理,比如:function fun1(arg1,fun

csdn_zsdf的博客 7141

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【ES6】Promise对象详解

【ES6】Promise对象详解一、Promise对象的含义二、Promise对象的用法三、Promise对象的几个应用【重点】1、时间延迟函数2、图片异步加载 引言:ES6新增的Generato、Promise、async都与异步编程有关。这里我们讲述Promise对象。 一、Promise对象的含义   所谓Promise就是一个对象,用来传递异步操作的消息。它代表了...

十一月廿七风雨大作 6946

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ES6——17. Promise对象

到了那个时候,Promise 的运行已经结束了,所以这个错误是在 Promise 函数体外抛出的,会冒泡到最外层,成了未捕获的错误。方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。事件的监听函数有两个参数,第一个是错误对象,第二个是报错的 Promise 实例,它可以用来了解发生错误的环境信息。方法,依次指定了两个回调函数。

chtazycdf的博客 1708

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ES6 Promise 对象

ES6 Promise 对象

m0_52913477的博客 1414

【ES6.0】- Promise对象

Promise是异步编程的一种解决方案,是一种javascript处理异步操作的一种常见方式。Promise是一种处理异步操作的设计模式,提供了一种更结构化,更可靠的方式来处理异步任务。

记录总结工作过往 867

es6中的promise对象

then中传了两个参数(这两个参数均为回调函数),then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。resolve函数的作用,将Promise对象的状态从“未完成”变成“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作。then方法是promise的最基本的方法,返回的是两个回调,一个成功的回调,一个失败的回调,实现过程如下。reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,

2501_90207151的博客 765

【前端】ES6:Promise对象和Generator函数

这也是Promise这个名字的由来,它的英语意思是“承诺”,一旦承诺成效,就不得再改变了。执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了状态机,还是一个遍历器对象生成函数。当一个回调函数嵌套一个回调函数的时候,就会出现一个嵌套结构,当嵌套的多了就会出现回调地狱的情况。Promise是异步编程的一种解决方案,比传统的解决方案回调函数,更合理和更强大。方法同样是将多个Promise实例,包装成一个新的Promise实例。p的状态由p1,p2,p3 决定,分成两种情况。

weixin_45980065的博客 1587

【JavaScript 教程】ES6 中的 Promise对象 详解

【JavaScript 教程】ES6 中的 Promise对象 详解 1、Promise对象含义 promise是异步编程的一种解决方法。 所谓promise,简单说是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上说,promise是一个对象,从它可以获取异步操作的消息,promise提供了统一的API,各种异步操作都可以用同样的方法进行处理。 2、Promise 的状态 Promise有3种状态: Pending:进行中 Resolved(Fulfilled):已完成

菜鸟的后花园 3152

ES6深入—Module 与 Promise 对象

当异步操作执行成功后,会将异步操作结果作为参数传入 resolve 函数并执行,此时 Promise 对象状态从 pending 变为 fulfilled;失败则会将异步操作的错误作为参数传入 reject 函数并执行,此时 Promise 对象状态从 pending 变为 rejected。如果传入的参数为空的可迭代对象,则同步返回一个已完成(already resolved)状态的 Promise;一个模块就是一个独立的文件。示例,新建一个名为 userInfo.js 的文件,在其中写入以下代码。

2401_87288886的博客 889

ES6 Promise对象

Promise 参阅: http://es6.ruanyifeng.com/#docs/promise promise 有三种状态, pending fulfilled 完成 rejected 出错 新建 promise 对象 新建 promise 对象的时候,传递两个方法 resolve reject 作为参数,这两个方法是系统已经存在的,直接用就可以了。 resolve 用于将 pro...

学习笔记 273

【ES6】Promise 对象

参考资料:阮一峰老师《ES6》电子书 一、Promise 的含义 1. Promise 是异步编程的一种解决方案。ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 2.Promise,简单来说就是一个容器,里面保存着(通常是)一个异步操作的结果。 3.Promise对象有以下两个特点: (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态...

Dora_5537的博客 493

ES6学习笔记——promise

概述 Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)。 ES6中的promise对象, 可以将异步操作以同步的流程表达出来,很好地解决了回调地狱的问题(避免了层层嵌套的回调函数) 在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发 promise对象的3个状态 初始化状态(等待状态):pending 成功状态:fullfilled 失败状态:rejected 使用promise的基本步骤 (1)创建promise对象 (2)调用prom

403 Forbidden 415
上一篇: ES6学习笔记(十三)Reflect对象
下一篇: ES6学习笔记(十五)Generator函数
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值