我是NodeJS的新手,它显然会导致一些问题,因为事情具有非常异步的性质。
我正在尝试找到必须用于创建新实例(关系)的实例:countryId
和clientId
。
显然,事情是异步发生的,因此变量是未定义的。我如何同步?
这是我在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
})
}
答案 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