Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个嵌套循环中的同步调用_Javascript_Node.js - Fatal编程技术网

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

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) {

如何在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 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
完成后直接调用它。这有用吗?