在Meteor中,是否可以从同步函数中做一个async函数(与wrapAsync相反)?

问题描述 投票:1回答:1

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

是否可以做相反的事情,如果可以,如何做?我有一个服务器端的函数,同步调用一些Meteor的东西(包括收款和账户)。我想能够以批处理的方式同时运行它,使用类似于 p-allasync.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中达到同样的目的。

javascript asynchronous meteor callback
1个回答
0
投票

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特有的,只有在服务器上才能使用。

© www.soinside.com 2019 - 2024. All rights reserved.