这样做是行不通的:
function myFunction(myObject){
let IM = await connectors.myModel.update({
myField: true,
}, {
where: {id: myObject.id},
returning: true,
});
}
但这确实有效:
function myFunction(myObject){
let IM = Promise.await(connectors.myModel.update({
myField: true,
}, {
where: {id: myObject.id},
returning: true,
}));
}
我知道您不能在await
之外使用async function
。Promise.await()
和即将发布的node.js特性Top-Level await
有什么区别?
发布于 2022-09-28 15:25:43
纤维与Promise.await
Meteor使用遮罩下的fibers
(coroutines,在这里回购)来支持异步编程。这就是为什么您可以在服务器上使用Meteor同步风格的代码编写,尽管它本质上可能是异步的:
const doc = MyCollection.findOne()
doc.someProp // yeay it's there without await
Promise.await
也是如此,它使用当前的光纤作为执行环境。可以在Meteor方法中运行以下代码:
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
,除非其他情况下不可能。
您已经可以编写服务器方法异步样式,而不会对行为产生那么大的影响:
Meteor.methods({
test: async function () {
const someAsyncFn = async () => 'foo'
const foo = await someAsyncFn()
return foo // 'foo'
}
})
就目前而言,您不能使用顶级等待,需要将其封装在一个生命块中:
(async () => {
})()
.then(res => {})
.catch(e => {})
发布于 2022-09-25 06:38:49
看起来这是因为Meteor,我的构建工具,正在做一些很酷的承诺。
发布于 2022-09-25 06:41:20
Promise.await接受一系列承诺,并在它们都解析时进行解析,并在解析时返回和数组结果。
顶级等待允许您调用等待,就好像整个全局代码都在异步块中一样。
您的代码可以工作,因为您没有等待Promise.await。你应该是,或者打电话给then
。
如果你想在顶层等待的话,把你的代码放在一个生命块中。
;(async function() {
await foo();
})();
https://stackoverflow.com/questions/73842485
复制相似问题