我知道如何使用 Meteor.wrapAsync()
为了使一个接受回调或返回承诺的函数可以像同步函数一样使用。
是否可以做相反的事情,如果可以,如何做?我有一个服务器端的函数,同步调用一些Meteor的东西(包括收款和账户)。我想能够以批处理的方式同时运行它,使用类似于 p-all
或 async.js
,以处理数组中的项目并等待完成。
该应用使用的是Meteor 1.6.0.1。
这里有一些代码,但无法工作,因为 "Meteor代码必须总是在Fiber中运行"。
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中达到同样的目的。
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特有的,只有在服务器上才能使用。