两个嵌套循环中的同步调用

我如何在Node.JS的两个嵌套的'for'循环中有同步调用:这是我的asynchronous调用; 我不知道我怎么能有我的代码的同步版本,这在create_db完成时进行下一次迭代!

var new_items = []; for (var key in config.models) { var selected_field = config.models[key]; for (var item in config.models[key].fields) { var selected_item = config.models[key].fields[item]; new_items.push({AttributeName: selected_item.name, AttributeType: selected_item.type}); } CreateDB(selected_field.name, new_items); var selected_item = config.models[key].fields[item]; } 

EDDITED:在create_db我使用callback函数!

 function CreateDB(name, new_items) { ddb.createTable(name, {hash: ['id', ddb.schemaTypes().number], range: ['time', ddb.schemaTypes().string], AttributeDefinitions: new_items }, {read: 1, write: 1}, function(err, details) { console.log("The DB is now created!"); }); 

}

谢谢

您将需要修改您的CreateDB函数,以便它需要callback,然后在.createTable的callback中调用该callback:

 function CreateDB(name, new_items, callback) { ddb.createTable(name, {hash: ['id', ddb.schemaTypes().number], range: ['time', ddb.schemaTypes().string], AttributeDefinitions: new_items }, {read: 1, write: 1}, function(err, details) { console.log("The DB is now created!"); callback(err, details); }); } 

然后你可以使用像async模块的每种方法 。 就像是:

 var async = require('async'); async.each(Object.keys(config.models), function(key, callback) { var new_items = []; var selected_field = config.models[key]; for (var item in config.models[key].fields) { var selected_item = config.models[key].fields[item]; new_items.push({AttributeName: selected_item.name, AttributeType: selected_item.type}); } CreateDB(selected_field.name, new_items, callback); }, function(err) { // All done with CreateDB calls }); 

你可能会尝试像期货 ,最特别是他们的序列代码,在这里: 序列

希望这可以帮助!

编辑:我相信你也可以使用es6-promise更内置的方法。 但是,我不知道这个… 🙂

我会build议使用async模块。 它有实用function,使我觉得你试图做的很容易。

 async.each(Object.keys(config.models), function(key, done) { var selected_field = config.models[key]; // I used the 'map' function to make it a bit easier to read var new_items = selected_field.fields.map(function(item) { return { AttributeName: item.name AttributeType: item.type }; }); CreateDB(selected_field, new_items, done); }, function(err) { // this gets called when all db calls are finished console.log("The DB is now created!"); }); function CreateDB(name, new_items, callback) { ddb.createTable(name, { hash: ['id', ddb.schemaTypes().number], range: ['time', ddb.schemaTypes().string], AttributeDefinitions: new_items }, { read: 1, write: 1 }, callback); }