0

我制作了一个 Meteor.Method(我们称之为 fullFlow),它本身调用了一堆 Meteor 方法。我的目标是异步调用后续方法,因为后续方法需要前一个方法的 res 才能完成工作。

问题是,fullFlow 的回调在它运行的系列中的第一个方法之后返回,因为第一个方法获得了返回值(然后将其传递给下一个方法等)。

这是我的问题:我希望 fullFlow 方法等到系列中的最后一个方法完成并将其值返回给 fullFlow 的回调。

我假设我的结构都是错误的,这就是发生这种情况的原因。如果有人可以帮助我并修复我的流程或解释我缺少的内容,我将不胜感激,以便我可以修复它!

这是代码:

Meteor.methods({
  step1(params) {
    // work with params
    return stuff
  },

  step2(params) {
    // work with params
    return stuff
  },

  step3(params3) {
    // work with params
    return stuff
  },

  fullFlow(params) {
    Meteor.call('step1', params, function (err, res) {
      if (err) {
        throw new Meteor.Error(err);
      } else {
        Meteor.call('step2', res, function (err, res) {
          if (err) {
            throw new Meteor.Error(err);
          } else {
            Meteor.call('step3', res, function (err, res) {
              if (err) {
                throw new Meteor.Error(err);
              } else {
                return res;
              }
            })
          }
        })
      }
    })
  }
})

function fullFlow() {
  Meteor.call('fullFlow', params, function (err, res) {
    if (err) {
      console.log(err)
    } else {
      console.log(res)
    }
  })
}

fullFlow();

现在发生的情况是,当 step1 的回调与 res 一起调用时,它也在调用 fullFlow 的主回调。奇怪的部分是 fullFlow 方法的其余部分仍然继续执行并按预期运行(即,它在进入下一个方法之前等待前一个方法的 res 并正确传递它),但是通用回调已被触发。

我的问题是我需要让这个 fullFlow 函数连续运行。我的目标是等待函数的回调被调用,然后在该回调中,调用函数本身重新开始。如果在完整系列方法完成之前调用回调,这将无法正常工作。我还需要将系列中调用的最后一个方法的 res 返回到 fullFlow 回调!

有任何想法吗?

4

1 回答 1

0

就这样,我想通了。

我在未来将所有内容都包装在 fullFlow 方法中。所以新的语法是:

var Future = Npm.require( 'fibers/future' );

fullFlow(params) {
  var future = new Future();

  Meteor.call('step1', params, function (err, res) {
    if (err) {
      throw new Meteor.Error(err);
    } else {
      Meteor.call('step2', res, function (err, res) {
        if (err) {
          throw new Meteor.Error(err);
        } else {
          Meteor.call('step3', res, function (err, res) {
            if (err) {
              throw new Meteor.Error(err);
            } else {
              return future.return(res);
            }
          })
        }
      })
    }
  })

  return future.wait();
}

现在整个事情不会回调,直到最后一个方法完成并且它成功地将最后一个res返回给fullFlow的回调。

这行得通,但我仍然不确定这是否是解决不良结构的一种骇人听闻的方法。我宁愿有适当的结构。如果有人可以纠正整体结构,请告诉我!

于 2017-07-05T15:12:37.350 回答