Javascript 两个嵌套循环中的同步调用
如何在Node.JS中的两个嵌套“for”循环中进行同步调用:这是我的异步调用;我不知道如何获得代码的同步版本,当create_db完成时,它将进入下一次迭代Javascript 两个嵌套循环中的同步调用,javascript,node.js,Javascript,Node.js,如何在Node.JS中的两个嵌套“for”循环中进行同步调用:这是我的异步调用;我不知道如何获得代码的同步版本,当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 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中,我正在使用回调函数
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!");
});
}
谢谢您可以尝试以下方法,尤其是序列码: 希望这有帮助
编辑:我相信您也可以使用es6 promise中更内置的方法。但是,我对此一无所知……:) 您需要修改
CreateDB
函数,使其接受回调,然后在中调用该回调。createTable
s回调:
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);
});
}
然后,您可以使用类似模块的功能。比如:
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
});
我建议使用
async
模块。它具有实用功能,使我认为您正在尝试做的事情非常容易
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);
}
嗯。您只有一个函数调用,它不在嵌套循环中。到底是什么问题?如果create_db是异步的,不能修改为同步的,并且没有实现promise接口,也没有回调,那么您的问题就没有解决方案。我在代码中没有看到任何异步调用。唯一的问题是您两次声明了相同的变量selected\u itemdited:在create\u db中,我正在使用callback函数!然后你需要一个递归函数,或者类似异步模块的东西。谢谢@KevinB,我也包括了我的CreateDB函数!递归对于一个循环很简单,对于两个嵌套循环也可以吗?非常感谢您的解决方案;我就是不明白你在async.each中用于“回调”的逻辑!我看到了文档(),他们正在为结果分配回调,但您没有!请您进一步解释一下好吗?您是否在async.each中分配“回调”以及它在create\u db中返回的内容?Thanksys,本质上是调用
callback
,调用结果为CreateDB
callback
正在从async传递。每个直接传递到CreateDB
,作为此处的最后一个参数:CreateDB(所选字段名、新项目、callback)代码>CreateDB
完成后直接调用它。这有用吗?