栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript如何与Promises链接和共享先前的结果

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript如何与Promises链接和共享先前的结果

有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决于您是在下一个呼叫中仅需要先前的数据,还是需要访问所有先前的数据。以下是几种型号:

馈送结果到下一个

callhttp(url1, data1).then(function(result1) {     // result1 is available here     return callhttp(url2, data2);}).then(function(result2) {     // only result2 is available here     return callhttp(url3, data3);}).then(function(result3) {     // all three are done now, final result is in result3});

将中间结果分配给更高范围

var r1, r2, r3;callhttp(url1, data1).then(function(result1) {     r1 = result1;     return callhttp(url2, data2);}).then(function(result2) {     r2 = result2;     // can access r1 or r2     return callhttp(url3, data3);}).then(function(result3) {     r3 = result3;     // can access r1 or r2 or r3});

在一个对象中累积结果

var results = {};callhttp(url1, data1).then(function(result1) {     results.result1 = result1;     return callhttp(url2, data2);}).then(function(result2) {     results.result2 = result2;     // can access results.result1 or results.result2     return callhttp(url3, data3);}).then(function(result3) {     results.result3 = result3;     // can access results.result1 or results.result2 or results.result3});

嵌套,因此可以访问所有以前的结果

callhttp(url1, data1).then(function(result1) {     // result1 is available here     return callhttp(url2, data2).then(function(result2) {         // result1 and result2 available here         return callhttp(url3, data3).then(function(result3) {  // result1, result2 and result3 available here         });     });})

将链条分解成独立的片段,收集结果

如果链中的某些部分可以独立进行,而不是一个接一个地进行,那么您可以分别启动它们,并使用它们

Promise.all()
来了解何时完成了这多个部分,然后您将获得这些独立部分中的所有数据:

var p1 = callhttp(url1, data1);var p2 = callhttp(url2, data2).then(function(result2) {    return someAsync(result2);}).then(function(result2a) {    return someOtherAsync(result2a);});var p3 = callhttp(url3, data3).then(function(result3) {    return someAsync(result3);});Promise.all([p1, p2, p3]).then(function(results) {    // multiple results available in results array    // that can be processed further here with    // other promises});

await
ES7中的序列

由于promise链只是一种用于对异步操作进行排序的机制,因此在ES7中,您还可以使用

await
,然后中间结果都可以在同一作用域中使用(也许比链接
.then()
处理程序的单独作用域更简单):

async function someFunction(...) {    const r1 = await callhttp(url1, data1);    // can use r1 here to formulate second http call    const r2 = await callhttp(url2, data2);    // can use r1 and r2 here to formulate third http call    const r3 = await callhttp(url3, data3);    // do some computation that has access to r1, r2 and r3    return someResult;}someFunction(...).then(result => {    // process final result here}).catch(err => {    // handle error here});


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号