首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Promise.await()与顶级等待?

Promise.await()与顶级等待?
EN

Stack Overflow用户
提问于 2022-09-25 06:33:04
回答 3查看 88关注 0票数 -1

这样做是行不通的:

代码语言:javascript
代码运行次数:0
运行
复制
function myFunction(myObject){
    let IM = await connectors.myModel.update({
        myField: true,
    }, {
        where: {id: myObject.id},
        returning: true,
    });
}

但这确实有效:

代码语言:javascript
代码运行次数:0
运行
复制
function myFunction(myObject){
    let IM = Promise.await(connectors.myModel.update({
        myField: true,
    }, {
        where: {id: myObject.id},
        returning: true,
    }));
}

我知道您不能在await之外使用async functionPromise.await()和即将发布的node.js特性Top-Level await有什么区别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-28 15:25:43

纤维与Promise.await

Meteor使用遮罩下的fibers (coroutines,在这里回购)来支持异步编程。这就是为什么您可以在服务器上使用Meteor同步风格的代码编写,尽管它本质上可能是异步的:

代码语言:javascript
代码运行次数:0
运行
复制
const doc = MyCollection.findOne()
doc.someProp // yeay it's there without await

Promise.await也是如此,它使用当前的光纤作为执行环境。可以在Meteor方法中运行以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
Meteor.methods({
  test () {
    const someAsyncFn = async () => 'foo'
    const foo = Promise.await(someAsyncFn())
    return foo // 'foo'
  }
})

顶级等待和本机异步/等待

现在,艾米想知道为什么在2022年流星仍然不会使用真正的非同步/等待。很简单,这是一个10年前的框架,具有很高的稳定性和向后兼容性。迈向本机异步/等待的步骤需要丢弃光纤,而光纤本身就深深地内置在Meteor的核心中!

然而,关于迁移到本机异步/等待的讨论已经导致了它的开发:https://github.com/meteor/meteor/discussions/11505

在即将推出的Meteor2.8中,将有第一个本机异步/等待支持。在此和仍然是假发之后,顶层异步将可用。

我该怎么办?

现在,您应该开始缓慢地重写代码,以便在Meteor2.8开始时进行异步/等待,并尽量避免Promise.await,除非其他情况下不可能。

您已经可以编写服务器方法异步样式,而不会对行为产生那么大的影响:

代码语言:javascript
代码运行次数:0
运行
复制
Meteor.methods({
  test: async function () {
    const someAsyncFn = async () => 'foo'
    const foo = await someAsyncFn()
    return foo // 'foo'
  }
})

就目前而言,您不能使用顶级等待,需要将其封装在一个生命块中:

代码语言:javascript
代码运行次数:0
运行
复制
(async () => {

})()
  .then(res => {})
  .catch(e => {})
票数 2
EN

Stack Overflow用户

发布于 2022-09-25 06:38:49

看起来这是因为Meteor,我的构建工具,正在做一些很酷的承诺。

票数 -1
EN

Stack Overflow用户

发布于 2022-09-25 06:41:20

Promise.await接受一系列承诺,并在它们都解析时进行解析,并在解析时返回和数组结果。

顶级等待允许您调用等待,就好像整个全局代码都在异步块中一样。

您的代码可以工作,因为您没有等待Promise.await。你应该是,或者打电话给then

如果你想在顶层等待的话,把你的代码放在一个生命块中。

代码语言:javascript
代码运行次数:0
运行
复制
;(async function() {
  await foo();
})();
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73842485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档