资讯专栏INFORMATION COLUMN

Promise

brianway / 1968人阅读

摘要:的状态对象有三种状态初始状态,既不是也不是成功。创建的基本语法使用来调用的构造器进行实例化注意时,会立即执行。等同于以下形式报错注意要想调用之后返回的对象的不是,必须一个值和返回对象的状态是,而不是

1 Promise的状态
1.1 Promise对象有三种状态:
pending 初始状态,既不是resolved也不是rejected;
resolved 成功。此时调用onFulfilled;
rejected 失败。此时调用onRejected;
resolved和rejected都可以表示为settled.最初Promise为pending状态,在执行后转为settled状态,而settled状态分为两种:在成功后转为resolved,执行.then(onFulfilled)方法;在失败后转为reject,执行.then(onRejected)或.catch(onRejected),进行异步操作,再返回Promise对象。

2 创建Promise的基本语法:
2.1 使用new来调用Promise的构造器进行实例化

var promise = new Promise(function(resolve, reject) {
  if(...) {
   resolve(data);
  } else {
   reject(new Error("error"));
  }
});
注意:new Promise(func)时,func会立即执行。

e.g.1
new Promise(function(resolve, reject) {
  console.log("#1");
  resolve(1);//执行完这行,内部属性[[PromiseStatus]]和[[PromiseValue]]都变了,分别由pending -> resolved, undefined -> 1
  console.log("#2");
}).then(function() {
  console.log("#3");
}); // #1 #2 #3 先执行主线程执行栈中的代码

e.g.2
new Promise(function(resolve, reject) {
  console.log("#1");
  reject(4);//执行完这行,内部属性[[PromiseStatus]]和[[PromiseValue]]都变了,分别由pending -> rejected, undefined -> 4
  console.log("#2");
}); // #1 #2 报错:Uncaught (in promise) Error: reject(…) 因为后面没有then/catch提供的onRejected回调,异常没有被消费掉

P.S. reject的参数可以是任意类型的,但一般都传入 Error对象表示错误原因

2.2 Promise.resolve & Promise.reject
Promise.resolve & Promise.reject可以认为是new Promise()的快捷方式,返回值也是一个promise对象,所以可以进行链式调用。

Promise.resolve(4); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 4}
等同于以下代码
new Promise(function(resolve) {
  resolve(4);
});
 
Promise.reject(4); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 4}
//等同于以下代码
new Promise(function(resolve, reject) {
  reject(4);
})

3 Promise.prototype.then(function onFulfilled() {...}, function onRejected() {...})
当resolve(成功)时,会调用onFulfilled函数;reject(失败)时,会调用onRejected函数。若只想处理异常情况的函数,可promise.then(undefined, onRejected),当然更好的选择是用promise.catch()来处理。二者效果相同。

promise.then(function (value) {
  console.log(value); 
}).catch(function (error) {
  console.log(error);
});
//等同于以下形式
promise.then(function (value) {
  console.log(value);
}, function (error) {
  console.log(error);
});
 
e.g.3
new Promise(function(resolve, reject) {
  resolve(2);
}); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 2}

e.g.4
new Promise(function(resolve, reject) {
  resolve(2);
}).then(function() {
  console.log("ha");
}); // ha Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}

e.g.5
new Promise(function(resolve, reject) {
  resolve(2);
}).then(function() {
  return "haha";
}); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "haha"}

e.g.6
new Promise(function(resolve, reject) {
  reject(2);
}); // Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: 2} 报错:Uncaught (in promise) 2

e.g.7
new Promise(function(resolve, reject) {
  reject(2);
}).then(function() {
}, function() {
  console.log("ha");
}); // ha Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: undefined}

e.g.8
new Promise(function(resolve, reject) {
  reject(2);
}).then(function() {
}, function() {
  return "haha";
}); // Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "haha"}

注意:要想调用then之后返回的promise对象的[[PromiseValue]]不是undefined,必须return一个值;
e.g.7和e.g.8返回对象的状态是 resolved,而不是 rejected.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94537.html

相关文章

  • Promise的几个扩展API总结

    摘要:的几个扩展总结描述和相反,当所有的被拒绝之后,方法执行完成的决议,如果存在一个执行完成的决议,方法则执行拒绝里边的所有实例反过来就好了执行到此执行到此描述忽略被拒绝的,只需要有一个完成的,方法就执行完成操作,如果全部的都被拒绝,方法执行拒绝 Promise的几个扩展API总结 1. Promise.none 描述: 和 Promise.all 相反,当所有的promise被拒绝之后,n...

    李义 评论0 收藏0
  • 异步发展流程 —— 手写一个符合 Promise/A+ 规范的 Promise

    摘要:构造函数的实现我们在使用的时候其实是使用关键字创建了一个的实例,其实是一个类,即构造函数,下面来实现构造函数。 showImg(https://segmentfault.com/img/remote/1460000018998456); 阅读原文 概述 Promise 是 js 异步编程的一种解决方案,避免了 回调地狱 给编程带来的麻烦,在 ES6 中成为了标准,这篇文章重点不是叙...

    UnixAgain 评论0 收藏0
  • Promise 对象的理解

    摘要:使用对象的好处在于可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。对象异步操作抛出错误,状态就会变为,就会调用方法指定的回调函数处理这个错误。 Promise 含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。 所谓 P...

    church 评论0 收藏0
  • Promise 中的三兄弟 .all(), .race(), .allSettled()

    摘要:对于的来说基元函数包括组合函数的类型签名返回情况完成如果传入的可迭代对象为空,会同步地返回一个已完成状态的。相反,如果是在指定的时间之后完成,刚返回结果就是一个拒绝状态的从而触发方法指定的回调函数。在行中,对每个小任务得到的结果进行汇总。 为了保证的可读性,本文采用意译而非直译。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 从ES6 开始,我们大都使用的是 P...

    vspiders 评论0 收藏0
  • 实现Promise

    摘要:使用是极好的,它是如此有用以至于我觉得应该好好研究一下,甚至是实现一个简易的版本。构造函数检查参数例如是不是函数啊初始化,创建对象执行因此构造函数里面传入的是立即被执行的。 使用Promise是极好的,它是如此有用以至于我觉得应该好好研究一下Promise,甚至是实现一个简易的版本。实现之前,我们先来看看Promise的用途: 使用Promise callback hell Promi...

    xcc3641 评论0 收藏0
  • 【笔记】你不知道的JS读书笔记——Promise

    摘要:写在前面这一章的顺序对于未接触过使用过的童鞋而言略抽象了,前边几章主要为了说明和之前的异步方式相比有什么优势和它能解决什么问题,后边才详解的设计和各种场景下如何使用。建议先了解和简单使用过后再阅读,效果更佳。 写在前面:Promise这一章的顺序对于未接触过使用过Promise的童鞋而言略抽象了,前边几章主要为了说明Promise和之前的异步方式相比有什么优势和它能解决什么问题,后边才...

    mumumu 评论0 收藏0

发表评论

0条评论

brianway

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<