有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决于您是在下一个呼叫中仅需要先前的数据,还是需要访问所有先前的数据。以下是几种型号:
馈送结果到下一个将中间结果分配给更高范围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});
awaitES7中的序列
由于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});
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)