我知道如何使用Meteor.wrapAsync()
,使接受回调或返回承诺的函数像同步一样可用。
是否有可能反其道而行之,如果是,如何做?我有一个服务器端函数,可以同步调用一些 Meteor 的东西(包括集合和帐户(。我希望能够批量并发运行它,使用p-all
或async.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,仅在服务器上可用。