我已经将我的代码重组为promises,并建立了一个精彩的长期承诺链,其中包含多个.then()回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们?
function getExample() {
return promiseA(…).then(function(resultA) {
// Some processing
return promiseB(…);
}).then(function(resultB) {
// More processing
return // How do I gain access to resultA here?
});
}
当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了
您不再需要单个then
调用或回调函数,因为在异步函数(被调用时返回一个Promise)中,您只需等待Promise直接解析即可。它还具有诸如条件,循环和try-
catch-clauses之类的任意控制结构,但是为了方便起见,我们在这里不需要它们:
async function getExample() {
var resultA = await promiseA(…);
// some processing
var resultB = await promiseB(…);
// more processing
return // something using both resultA and resultB
}
在等待ES8时,我们已经使用了非常相似的语法。ES6带有生成器功能,该功能允许按任意放置的yield关键字将执行分段。这些切片可以相互独立,甚至异步地运行-这就是我们要在执行下一步之前等待promise解析时所要做的。
有专用的库(例如co或task.js),但是还有许多Promise库具有辅助函数(Q,Bluebird,when …),当您为它们提供生成器函数时,它们会为您逐步执行异步操作产生希望。
var getExample = Promise.coroutine(function* () {
// ^^^^^^^^^^^^^^^^^ Bluebird syntax
var resultA = yield promiseA(…);
// some processing
var resultB = yield promiseB(…);
// more processing
return // something using both resultA and resultB
});
从4.0版开始,它确实在Node.js中起作用,而且一些浏览器(或其开发版本)相对较早地支持生成器语法。
但是,如果您希望/需要向后兼容,那么在没有编译器的情况下不能使用它们。当前工具支持生成器功能和异步功能,例如,请参见Babel有关生成器和异步功能的文档。
然后,还有许多其他 专门用于简化异步编程的可编译为JS的语言。他们通常使用类似语法await(例如冰的CoffeeScript),但也有其他人配备了哈斯克尔样do-notation(如LatteJs,一元,PureScript或LispyScript)。
问题内容: 我已经将我的代码重组为,并建立了一个精彩的长期承诺链,其中包含多个回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 你不再需要单个调用或回调函数,因为在异步函数(被调用时返回一个Pro
问题内容: 我正在使用bluebird库,需要发出一系列HTTP请求,并且需要对下一个HTTP请求的某些响应数据。我建立了一个函数来处理我的请求。这需要一个URL和POST的正文。 我这样称呼它: 第一个请求获取一个API密钥,该密钥需要传递给第二个请求,依此类推。如何从第一个请求中获取响应数据? 更新 这是功能: 问题答案: 有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决
问题内容: 为了在数据库中创建对象,我已经创建了许多许诺。 最后,我要按我想要的顺序履行所有诺言。(因为somes对象依赖于其他对象,所以我需要保持该顺序) 所以我希望看到: 不幸的是,这些消息被打乱了,我不明白。 谢谢 问题答案: 看起来您理解了Promise错误,请重新阅读有关Promise和本文的一些教程。 使用创建承诺后,它会立即被调用,因此所有函数实际上都是在创建它们时执行的,而不是在链
问题内容: 我正在使用bluebird库,需要发出一系列HTTP请求,并且需要对下一个HTTP请求的某些响应数据。我建立了一个函数来处理我的请求。这需要一个URL和POST的正文。 我这样称呼它: 第一个请求获取一个API密钥,该密钥需要传递给第二个请求,依此类推。如何从第一个请求中获取响应数据? 更新 这是功能: 问题答案: 有一些模型用于从属承诺并将数据从一个传递到另一个。哪种方法效果最好取决
在TYPO3中有一个新的AbstractViewHelper(TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper),我试图用它来实现一个非常简单的InArrayViewHelper到我的项目中。 问题是,如果您想访问或子标记,您应该使用https://docs.typo3.org/m/typo3/book-extbasefluid/master/
我正在尝试将任务链接到CompletableFuture中,以并行执行它们并获得最佳性能和资源利用率。 我正在编写的工作流有五个阶段,每个阶段取决于前几个阶段的结果。 工作流执行如下: 我可以创建一个结果持有器对象来保存每个阶段的结果。但是,我不确定这是否是最好的解决方案。 CompletableFuture是此用例的最佳解决方案吗?链接这些阶段的最佳方式是什么?