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 的写法才支持使用多个语句。)。

相关内容

热门资讯

全球基金疯狂逃离印度股市 3月1日消息,印度股市一改去年牛市气息,近期指数持续下挫,更令人担心的是,外国资金的持续流出。据印度...
韩歆毅正式接任蚂蚁集团CEO 3月1日消息,蚂蚁集团官网更新显示,蚂蚁集团前总裁韩歆毅正式接任蚂蚁集团CEO一职。
越南总理同中资企业代表举行座谈 3月1日消息,越南总理范明政2月28日主持同中资企业座谈会,副总理胡德福、阮志勇及相关政府部门负责人...
深圳2月一二手住宅网签量同比翻... 3月1日消息,深圳乐有家研究中心最新公布的数据显示,2月深圳一二手住宅网签总量超6000套,均实现同...
马克龙:欧盟计划对美国钢铝征收... 3月1日消息,法国总统马克龙2月28日在对葡萄牙进行国事访问期间表示,如果美国对从欧洲进口商品征收2...
双引擎驱动高质量增长:复星医药... 本文来源:时代周报 作者:张扬3月24日,复星医药(600196.SH;02196.HK)发布202...
泡泡玛特、快手、中芯国际、华虹... 3月26日,香港恒生指数收跌1.89%再度失守25000点,恒生科技指数跌3.28%。 贵金属板块普...
法兰泰克:2025年净利润2.... 新京报贝壳财经讯 3月26日,法兰泰克发布业绩快报,2025年度公司实现营业收入24.19亿元,同比...
美乌领导人谈崩,欧洲领导人提议... 3月1日消息,美国总统唐纳德·特朗普与乌克兰总统弗拉基米尔·泽连斯基原定2月28日在白宫正式签署美乌...
上海青浦西岑国际人才港开港,最... 3月1日消息,上海青浦西岑国际人才港3月1日正式开港,将打造“一站式”人才服务综合体。当天,青浦区在...