【问题标题】:will it be possible to drop async/await in javascript and make async transparent?是否可以在 javascript 中删除 async/await 并使异步透明?
【发布时间】:2019-02-09 07:50:30
【问题描述】:

我最近对async/await 很瘦,它的情况与参考文献相似。 在 javascript 中,没有低级语言中存在的指针、取消引用运算符等,这使得 javascript 看起来更简单,因为它假装变量存储对象的值,而实际上它存储对对象的引用并神奇地将其解析为当对象注意到您实际上想要获取数据时。所以看起来变量存储了对象本身。

可以观察到与 promise 完全相同的情况:当您将 promise 存储在某个变量中时,您实际上并不关心 promise 本身 - 您关心的是它的值。

AFAIK javascript 中没有指针,因为它们令人困惑,并且可以被抽象出来。承诺也是如此。

而不是做

const data = await fetch("endpoint");

你可以这样做

const data = fetch("endpoint");

因为 javascript 会发现您想要的是 fetch 返回的数据。 Promise 和 async/await 实际上可能成为语言的内部实现细节。

  1. 有可能吗(意思是可以用javascript实现)?
  2. 是否有一种语言已经可以做到这一点?
  3. 您希望它登陆 javasrcipt 吗?

【问题讨论】:

  • @JaromandaX 如果这让您感到困惑,请查看 Go。 “等待”在任何地方都是隐含的,如果你想“退出”等待,你可以用“去”前缀调用函数。这是一个比 javascript 更理智的模型。
  • @JaromandaX 同样适用于引用和指针,但它们在 javascript 中不存在,你可以不用它们
  • what you want is the data returned by the fetch - 这并不总是正确的。例如,您可能希望存储对 promise 的引用,以便了解您的请求是否是最后一个请求,并且您希望丢弃先前请求的结果。
  • @JaromandaX,我的回应是“你为什么要取消这个选择”。我的观点是,还有其他语言明确等待并且仍然可以选择。
  • @JaromandaX 我是说 javascript 中没有指针,因为我认为它们会让人们感到困惑,并且可以被抽象出来。承诺也是如此。

标签: javascript promise async-await


【解决方案1】:

javascript 极不可能支持这种模式。当前处理异步代码的方法是如此之深,以至于到处都有“显式等待”确实会使 javascript 不再是 javascript。我确实认为有可能提出一种可以编译为 javascript 的语言。

如果您正在寻找一种可以执行此操作的语言,请查看 Go。对于异步编程来说,这是一个更明智的模型,因为它从一开始就被考虑在内。在 javascript 中,promise 和 async/await 是在很久以后才加入的。

10 次中有 9 次你会想要“等待”一个异步函数,所以在 go 中每个函数都是“等待”的。如果你不想“等待”一个函数,你可以这样调用函数:

go foo()

所以比较 Go 和 Javascript,goawait 关键字非常相似,但用于相反的情况。

在go中,函数前面的async关键字也是不需要的。

【讨论】:

  • @Bergi 你是对的,但我认为这与问题无关。
  • 我只是想挑战一下“这是一个更明智的异步编程模型” :-) JS 具有 run-to-completion 语义,并且被设计为线程安全的开始。异步执行某些操作必须是明确的,因为它允许并发。
  • 有道理@Bergi。也许它会更好地表述为:“处理 async/await 函数的 Go 风格可能更适合 javascript”。
  • 也许吧,但我真的认为它的并发模型是 JavaScript 流行和成功的基石。
  • 并发模型(对我来说)感觉像是事后才想到的。这是相当主观的。我绝对认为javascript并发模型+“默认等待”绝对是一种可行的语言,它(AFAIK)还不存在。
猜你喜欢
  • 2016-11-16
  • 1970-01-01
  • 2019-04-30
  • 2019-05-12
  • 1970-01-01
  • 2013-06-08
  • 2015-12-19
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多