如何在LoopBack中同步查找实例并创建

时间:2017-03-01 10:49:50

标签: node.js loopbackjs

我是NodeJS的新手,它显然会导致一些问题,因为事情具有非常异步的性质。

我正在尝试找到必须用于创建新实例(关系)的实例:countryIdclientId

显然,事情是异步发生的,因此变量是未定义的。我如何同步?

这是我在LoopBack中的启动脚本

module.exports = function(app) {
    var Client = app.models.Client
    var Country = app.models.Country
    var BillingAddress = app.models.BillingAddress

    Client.create([
        {username: 'test@test.gov', email: 'test@test.gov', password: 'nasapassword'},
        {username: 'test2@test2.gov', email: 'test2@test2.gov', password: 'nanapassword'}
    ], function(err, clients){
        if(err) throw err
    })


    Country.findOne({where: {name: 'Spain'}},
        function(err, country) {
            if(err) throw err
        }
    )

    Client.findOne({where: {email: 'john@nasa.gov'}},
        function(err, client) {
            if(err) throw err
        }
    )

    BillingAddress.create([
        {first_name: 'Jimbo', last_name: 'Juice', address_line_1: 'Loool street', postal_code: '23232', countryId: country.id, clientId: client.id}
    ], function(err, billingaddress) {
        if(err) throw err

    })
}

1 个答案:

答案 0 :(得分:1)

这是不可能的。应将异步函数视为异步调用。

您可以使用async模块。

module.exports = function(app, cb) {
    var Client = app.models.Client;
    var Country = app.models.Country;
    var BillingAddress = app.models.BillingAddress;

var clientData = [{username: 'test@test.gov', email: 'test@test.gov', password: 'nasapassword'},
        {username: 'test2@test2.gov', email: 'test2@test2.gov', password: 'nanapassword'}];

async.parallel({
  clients: function(callback){
    async.map(clientData, Client.create.bind(Client), function(err, clients){
      if(err) return callback(err);
      callback(null, clients);
    });    
  },
  country: function(callback){
    Country.findOne({where: {name: 'Spain'}}, callback);
  },
  nasaClient: function(callback){
    Client.findOne({where: {email: 'john@nasa.gov'}}, callback);
  }
}, function(err, results){
     if(err) return cb(err);

   BillingAddress.create([
        {first_name: 'Jimbo', last_name: 'Juice', address_line_1: 'Loool street', postal_code: '23232', countryId: results.country.id, clientId: results.nasaClient.id}
    ], function(err, billingaddress) {
        if(err) return cb(err);
        cb(null);
    });
});

}

有些观点:

  • 启动脚本也应该是异步的
  • 避免抛出异常。只需按callback s
  • 处理即可