简体   繁体   English

带参数的Nodejs ORM2回调

[英]Nodejs ORM2 callback with parameters

I am creating models in the for statement: 我在for语句中创建模型:

  for (var j = 0; j < data.length; j++) {
        models.MyModel1.create({ name : data[j].name }, 
          function(err, model){
            if (err) {
              throw err
            }
            models.OtherMyModel.create({ model_id : model.id, index : j }], 
               function(err,submodule){
            });
        });
      }

So here I want to create submodel that will use parent model id and it's index j. 因此,在这里我想创建将使用父模型ID及其索引j的子模型。 And because of async var j will be data.length - 1 for all callback. 而且由于异步,var j将为data.length-所有回调都为1。 How I can pass index parameter to the model creation callback? 如何将索引参数传递给模型创建回调?

You can use promises to achieve that. 您可以使用诺言来实现这一目标。
The following snippet uses when : 以下代码段以下情况下使用:

var when = require('when');
var nodefn = require('when/node/function');
var promises = [];

// Wrap model creation functions by a promise
var createMyModel1 = nodefn.lift(models.MyModel1.create);
var createOtherMyModel = nodefn.lift(models.OtherMyModel.create);

for (var j = 0; j < data.length; j++) {
  // Store the index into a local variable because when the first promise
  // will resolve, `i` would be equal to `data.length`!
  var index = j;

  // Create the first model
  var promise = createMyModel1({
    name: data[j].name
  }).then(function(model) {
    // Once the model is created, create the submodel
    return createOtherMyModel({
      model_id: model.id,
      index: index
    });
  }, function(err) {
    throw err;
  });

  // Store the promise in order to synchronize it with the others
  promises.push(promise);
}

// Wait for all promises to be resolved
when.all(promises).then(function() {
  console.log('All models are created');
});

Another solution is to use yield and any coroutine runner (available since node.js 0.11.x): 另一个解决方案是使用yield和任何协程运行程序(自node.js 0.11.x起可用):

var co = require('co');

// Thunkify model creation functions
var createMyModel1 = function(data) {
  return function(fn) { models.MyModel1.create(data, fn); };
};

var createOtherMyModel = function(data) {
  return function(fn) { models.OtherMyModel.create(data, fn); };
};

co(function *() {
  for (var j = 0; j < data.length; j++) {
    // Create first model
    var model = yield createMyModel1({
      name: data[j].name
    });

    // Create its submodel
    var submodel = yield createOtherMyModel({
      model_id: model.id,
      index: j
    });
  }
})();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM