我一直在浏览async
/ await
在浏览了几篇文章之后,我决定自己测试一下。但是,我似乎无法绕开为什么这行不通的想法:
async function main() {
var value = await Promise.resolve('Hey there');
console.log('inside: ' + value);
return value;
}
var text = main();
console.log('outside: ' + text);
控制台输出以下内容(节点v8.6.0):
外部:[对象承诺]
内部:嘿
为什么函数内部的日志消息随后执行?我认为创建async
/ 的原因await
是为了使用异步任务执行同步执行。
有没有办法可以使用函数内部返回的值而不使用.then()
after main()
?
我似乎无法绕开为什么这行不通的想法。
因为main
回报承诺;所有async
功能都可以。
在顶层,您必须:
使用async
永远不会拒绝的顶层函数(除非您希望出现“未处理的拒绝”错误),或者
使用then
和catch
,或
(即将推出!) 使用顶层await
,该提案已进入允许在模块中顶层使用的过程中的第3阶段await
。
async
永不拒绝的顶级功能(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
注意catch
; 您 _必须_处理promise拒绝/异步异常,因为没有其他事情要做;您没有呼叫者将其传递给。如果愿意,可以在通过catch
函数调用它的结果上执行此操作(而不是try
/catch
语法):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
…更加简洁(出于这个原因,我喜欢它)。
或者,当然,不处理错误,而只允许“未处理的拒绝”错误。
then
和catch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
该catch
如果发生在链中或在你的错误处理程序将调用then
处理程序。(请确保您的catch
处理程序不会抛出错误,因为没有任何内容可以处理。)
或两个参数都then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
再次注意,我们正在注册一个拒绝处理程序。但是,以这种形式,请确保您的then
回调都不会引发任何错误,也没有任何内容可处理。
await
模块您不能await
在非模块脚本的顶层使用await
,但是顶层[建议第3阶段)允许您在模块的顶层使用它。这与使用顶级async
函数包装器(上面的#1)相似,因为您不希望您的顶级代码拒绝(抛出错误),因为这将导致未处理的拒绝错误。因此,除非您要在出现问题时(例如#1)遇到未处理的拒绝,否则您要将代码包装在错误处理程序中:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
问题内容: 示例了如何使用内置的加密库和流来计算文件的md5。 但是是否可以将其转换为使用ES8异步/等待而不是使用上述回调,但仍保持使用流的效率? 问题答案: / 仅适用于promise,不适用于流。有一些想法可以制作一种类似流的额外数据类型,该数据类型将具有自己的语法,但是如果有的话,这些想法是高度实验性的,我将不赘述。 无论如何,您的回调仅等待流结束,这非常适合兑现承诺。您只需要包装流: 现
我已经复习了/,在复习了几篇文章之后,我决定自己测试一下。然而,我似乎无法理解为什么这不起作用: 控制台输出以下内容(节点V8.6.0): >外:“对象承诺” >内部:嘿那里 为什么函数内部的日志消息会在之后执行?我认为创建/的原因是为了使用异步任务执行同步执行。 有没有一种方法可以使用函数内部返回的值,而不用后面的?
我需要在函数中运行各种步骤,但步骤必须按特定顺序运行。我尝试实现一个函数,如下所示: 控制台中的预期结果应该是1,2,3,但我得到了3,2,1。似乎忽略了参数。 编辑功能在上面的示例中仅用于模拟繁重的任务。在我的项目中,我不会使用它。事实上,我需要连接到一个数据库,然后在进入下一步之前重新格式化结果。即使包括,2也会在1之前登录。换句话说,空列表被传递到我的图形,因为没有考虑。以下是我当前的代码:
我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。
我想进行一个基于当前状态的API调用,但不能使setState函数作为异步函数工作。 给我错误: 类型为“”的参数(状态:只读)= 如果我在setState方法之外获取数据,它会起作用,但我害怕对过时的页码进行API调用:
我试图找到问题的解决方案,但找不到,正在寻找一些“最佳实践范例”。我有一个nodejs express应用程序,我的函数被拆分成文件。例如,我有一个控制器(oktacontroller.js): 在两个导出的函数(都是快速路由)中,我都需要var-okta_-api_键。我知道我可以通过在这两个函数中查询它们来获得它们,因为它们是异步函数,我可以在那里使用wait,但是每次查询都感觉很愚蠢(因为它