在 Meteor 中,是否可以从同步函数(与 wrapAsync 相反)创建异步函数?



我知道如何使用Meteor.wrapAsync(),使接受回调或返回承诺的函数像同步一样可用。

是否有可能反其道而行之,如果是,如何做?我有一个服务器端函数,可以同步调用一些 Meteor 的东西(包括集合和帐户(。我希望能够批量并发运行它,使用p-allasync.js之类的东西来处理数组中的项目并等待完成。

该应用程序使用的是Meteor 1.6.0.1。

这里有一些代码,它不起作用,因为"Meteor代码必须始终在光纤中运行":

const actions = entries.map(entry =>
() => new Promise((resolve, reject) =>
Meteor.defer(() => {
try {
const result = createUserFromEntry(entry, schoolId, creatorId, recordTypeId, signupYmd);
resolve(result);
} catch (exc) {
reject(exc);
}
})
)
);
Meteor.wrapAsync(callback =>
pAll(actions, { concurrency: 8, stopOnError: false })
.then(res => callback(null, res))
.catch(err => callback(err, null))
)();

也欢迎在流星内部以不同/适当的方式实现相同目标的建设性建议。

Meteor.defer要求传递的函数在光纤内运行。这可以使用Meteor.bindEnvironment修复:

Meteor.defer(Meteor.bindEnvironment(function () {
try {
const result = createUserFromEntry(entry, schoolId, creatorId, recordTypeId, signupYmd);
resolve(result);
} catch (exc) {
reject(exc);
}
}))

p-all函数不需要包装,因为它已经是异步的:

Meteor.startup(async function () {
const done = await pAll(actions, { concurrency: 8, stopOnError: false })
})

但是,有一个不错的糖果可以让您在同步函数中运行异步代码,只要您在光纤中,使用Promise.await

Meteor.startup(function () {
const done = Promise.await(pAll(actions, { concurrency: 8, stopOnError: false }))
})

请注意,该Promise.await特定于 Meteor,仅在服务器上可用。

最新更新