【发布时间】:2021-03-12 19:44:48
【问题描述】:
我是一般异步代码的新手(尤其是 JavaScript),并且一直是 common pitfalls 的牺牲品,所以我想重新评估我最基本的假设。
测试下面的代码并没有给我答案,因为仅仅因为测试通过了,并不意味着代码将来会以同样的方式运行。
这个问题很笼统,所以我将举几个具体的例子来说明我试图理解的基础知识。
第一个例子
const secret_key = "BLAH BLAH";
var url = `https://www.google.com/recaptcha/api/siteverify?secret=${secret_key}&response=${token}`;
如果上述代码出现在异步函数中,我能否确定 url 将被正确定义(即第二个语句将出现在第一个语句之后)?如果secret_key 是var,这会改变吗?还是let?
第二个例子
blah = async function() {
syncFunction();
}
我能否确定 同步 函数将在函数返回之前运行完成(即使它必须做一些耗时的工作)?
我问是因为我的理解是,除非我使用 await / promises,否则异步函数 (as explained here) 不会这样。
更新
最后,this Stack Overflow question 解决了我的问题。基本上我使用的是 await,但是被调用的函数有一个未定义的 Promise。
【问题讨论】:
-
是的,不,不,是的。特别是在最后一部分中,异步函数在
syncFunction完全运行之前无法完成,请注意,您实际上并没有在该 sn-p 中调用函数,您只需在blah中定义一个新函数,syncFunction是实际上这里根本没有调用。 -
@luk2302 你能详细说明最后一部分吗(即
syncFunction实际上根本没有在这里调用)?也许更好的例子是if (syncFunctionReturnsFalse()) { return false; } // do other stuff... 我想确保 if 语句等待同步函数。 -
你只声明/定义一个函数,你从不运行它,
blah是函数,它不是它的承诺或它的返回值,它是 这个函数,只有blah()会真正运行它。 -
如果它当然等待,它不能不等待。
-
啊,我明白你的意思了 - 我省略了对
blah();的调用(我将调用视为隐式调用)。你说“在syncFunction完全运行之前,异步函数无法完成”并且“当然它会等待”,但这对于异步函数调用来说并非如此,令我惊讶的是(假设我正确理解了那篇文章)。
标签: javascript amazon-web-services aws-lambda