Promise链式调用
创始人
2025-05-28 05:02:51
0

Promise是一个对象,它代表了一个异步操作的最终完成或者失败

Promise 对象的状态

Promise 对象通过自身的状态,来控制异步操作。Promise 实例具有三种状态。

  • 异步操作未完成(pending)
  • 异步操作成功(fulfilled)
  • 异步操作失败(rejected)

上面三种状态里面,fulfilledrejected合在一起称为resolved(已定型)。

这三种的状态的变化途径只有两种。

  • 从“未完成”到“成功”
  • 从“未完成”到“失败”

一旦状态发生变化,就凝固了,不会再有新的状态变化。这也是 Promise 这个名字的由来,它的英语意思是“承诺”,一旦承诺成效,就不得再改变了。这也意味着,Promise 实例的状态变化只可能发生一次。

因此,Promise 的最终结果只有两种。

  • 异步操作成功,Promise 实例传回一个值(value),状态变为fulfilled
  • 异步操作失败,Promise 实例抛出一个错误(error),状态变为rejected

链式调用

连续执行两个或者多个异步操作是一个常见的需求,在上一个操作执行成功之后,开始下一个的操作,并带着上一步操作所返回的结果。我们可以通过创造一个 Promise 链来实现这种需求。见证奇迹的时刻:then() 函数会返回一个和原来不同的新的 Promise

在过去,要想做多重的异步操作,会导致经典的回调地狱:

doSomething(function(result) {doSomethingElse(result, function(newResult) {doThirdThing(newResult, function(finalResult) {console.log('Got the final result: ' + finalResult);}, failureCallback);}, failureCallback);
}, failureCallback);

现在,我们可以把回调绑定到返回的 Promise 上,形成一个 Promise 链:

doSomething().then(function(result) {return doSomethingElse(result);
})
.then(function(newResult) {return doThirdThing(newResult);
})
.then(function(finalResult) {console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);

then 里的参数是可选的,catch(failureCallback) 是 then(null, failureCallback) 的缩略形式。如下所示,我们也可以用箭头函数来表示:

doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => {console.log(`Got the final result: ${finalResult}`);
})
.catch(failureCallback);

**注意:**一定要有返回值,否则,callback 将无法获取上一个 Promise 的结果。(如果使用箭头函数,() => x 比 () => { return x; } 更简洁一些,但后一种保留 return 的写法才支持使用多个语句。)。

相关内容

热门资讯

603839实控人等,被立案调... 8月26日,安正时尚发布公告称,因涉嫌信息披露违法违规,中国证监会于当日对控股股东、实际控制人郑安政...
逆转与血洗:一夜之间,足球世界... 在这个令人热血沸腾的8月26日,足球场上发生了令人难以置信的两场比赛,彻底颠覆了我们对比赛的认知。你...
国内商品期市夜盘收盘,油脂油料... 8月26日,国内商品期市夜盘收盘,多数上涨,油脂油料涨幅居前,CZCE菜粕涨1.97%;能源品全部上...
算力租赁,这门生意正在闷声发财... 订阅 快刀财经 ▲ 做您的私人商学院现在的算力还在"一卡难求",这门生意的量价齐升逻辑,短期内还...
短剧行业大洗牌:90%亏损,头... 俘获观众后,看剧开始迎来“收割”?作者 :唐纳德来源: 快刀财经(ID:kuaidaocaijing...
巨人网络上半年净利21.44亿... 中经记者 李哲 北京报道8月26日,巨人网络(002558.SZ)发布2026年半年度报告。上半年,...
Palo Alto Netwo... 8月26日,Palo Alto Networks首席执行官Nikesh Arora在以250亿美元达...
第二届世界人形机器人运动会落幕... 本文来源:时代周报8月26日,第二届世界人形机器人运动会在北京国家速滑馆“冰丝带”落幕。智元取得金牌...
隔膜龙头恩捷股份上半年净利增长... 锂电隔膜龙头恩捷股份(002812.SZ)最新披露的2026年半年度报告显示,今年上半年,该公司实现...
上半年收入超去年全年,Mini... 8月26日,MiniMax发布了2026年半年度业绩报告。上半年MiniMax总收入约为1.2亿美元...