【问题标题】:What guarantees exist in asynchronous JavaScript?异步 JavaScript 中存在哪些保证?
【发布时间】: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


【解决方案1】:

第一个例子

我能否确定 url 将被正确定义(即第二个 语句会出现在第一个之后)?

为什么是的,当然。这些只是两行常规代码,您只需将两个字符串存储在两个变量中;当然会按顺序执行,这里没有什么异步的。

第二个例子

使用 Typescript 而不是 Javascript 对我理解 async 函数的工作原理有很大帮助。这是您在 Typescript 中的示例:

const syncFunction = ():string => {
    return "hello"
}

const blah = async ():Promise<string> => {
    return syncFunction()
}

(async () => {
    const sayHello:string = await blah();
    console.log(sayHello) // "hello"
})()

如您所见,添加类型会有所帮助。 async 函数总是返回一个 Promise。如果你return true,那么返回的类型不是boolean,而是Promise&lt;boolean&gt;

所以,return syncFunction() 返回一个“hello”的 Promise。因此,您必须await 它才能真正获得您的“hello”字符串。然后你就可以登录了。

相同的代码被转译为 JS,因此它可以在 sn-p 中运行:

const syncFunction = () => {
    return "hello"
}

const blah = async () => {
    return syncFunction()
}

(async () => {
   const sayHello = await blah();
    console.log(sayHello) // "hello"
})()

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2019-04-03
    • 2018-06-29
    相关资源
    最近更新 更多