总要有人来改变世界的,为什么不能是你呢

ES6浅谈之Promise

首先来回想一下Promise对象的写法:

复制代码
// 方法1
let promise = new Promise ( (resolve, reject) => {
    if ( success ) {
... resolve(a);
// pending ——> resolved 参数将传递给对应的回调方法 } else {
... reject(err);
// pending ——> rejected } } ) // 方法2 function promise () { return new Promise ( function (resolve, reject) { if ( success ) {
... resolve(a); }
else {
... reject(err); } } ) }
复制代码

Promise对象有三种状态:pending、resolved、rejected。

并且Promise对象在实例化之后内部代码会立即执行,并且会由pending状态转化为其余两种状态。

这些立即执行的代码与外部代码是同步的,即:按先后顺序依次执行(js的单线程特性)

复制代码
var b ;
function a(){
    b = new Promise(function(resolve, reject){
        console.log('over');
        resolve('over');
    });
}
a();
b.then(n=>console.log(n));
console.log("begin-----");
复制代码

a()函数的执行,为b变量进行了初始化操作,使得b成为了一个Promise对象;

于是这个Promise对象(b)内部的代码会立即执行---console.log('over'),并获得resolved状态;

接下来执行b(Promise对象)的then方法,由于

then方法内部回调是异步的,所以等待其余同步代码先执行

console.log("begin-----");这是一个同步操作,会紧接着上一个同步代码(console.log('over'))执行;

最终,虽然Promise对象的then方法排在第二步,由于它是异步的,导致内部回调函数最后执行;

控制台依次输出:over;begin-----;over。

既然前面说到Promise对象在实例化之后可能获得两个不同状态,那么自然对这两个状态都有不同的方式去处理;

then(success(),error()),针对不同状态进行不同处理,即两个不同的回调函数,并将获得状态时的函数参数传递到回调函数里

catch(error),用于处理rejected状态传递出来的error对象,所以通常then()不用写error()回调,直接由catch来捕获错误,

并且还可以捕获上面success()回调产生的错误。

 

待续。。。

 

posted @   桔子桑  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示