Nano Hash - криптовалюты, майнинг, программирование

Как отправить асинхронные данные mongodb из внутренних функций во внешнюю функцию обратного вызова из цикла for?

НОВЫЙ ПОСТ:

Вот пример рабочего асинхронного кода без db. Проблема в том, что если я заменю vars (data1_nodb,...) на db.collection.find(); все необходимые переменные базы данных получены в конце, а цикл for() завершается некорректно. Я надеюсь, что это объясняет мою проблему немного лучше. ОА

        var calc = new Array();
        function mach1(callback){               
                    
                            error_buy = 0;                                                  
                            
                            // some vars                            
                            
                            for(var x_c99 = 0; x_c99 < array_temp_check0.length;x_c99++){
                                
                                // some vars                        
                                    
                                    calc[x_c99] = new Array();                                      
                                    calc[x_c99][0]= new Array();    
                                    
                                    calc[x_c99][0][0] = "dummy1";
                                    calc[x_c99][0][1] = "dummy2";
                                    calc[x_c99][0][2] = "dummy3";
                                    calc[x_c99][0][3] = "dummy4";
                                    calc[x_c99][0][4] = "dummy5";
                                    
                                    function start_query(callback) {

                                            data1_nodb = "data1";
                                            data2_nodb = "data2";
                                            data3_nodb = "data3";
                                            data4_nodb = "data4";

                                            
                                            calc[x_c99][0][0] = data1_nodb;
                                            calc[x_c99][0][1] = data2_nodb;
                                            calc[x_c99][0][2] = data3_nodb;
                                                        
                                        
                                            callback(data1_nodb,data2_nodb,etc..);
                                            
                                    }
                                        
                                            start_query(function() {
                                                
                                                console.log("start_query OK!"); 
                                                
                                                function start_query2(callback) {
                                                                    
                                                data4_nodb = "data5";
                                                data5_nodb = "data6";
                                                data6_nodb = "data7";
                                                
                                                
                                                calc[x_c99][0][3] = data4_nodb;
                                                calc[x_c99][0][4] = data5_nodb;
                                                    
                                                callback(data5_nodb,data6_nodb,etc..);
                                                
                                            }                                           
                                            
                                            start_query2(function() {
                                                
                                                console.log("start_query2 OK!");    
                                                
                                                    function start_query3(callback) {
                                                        
                                                            
                                                        for(...){
                                                            
                                                                // do something
                                                            }
                                                        
                                                            callback(vars...);                                              
                                                        }
                                            
                                                start_query3(function() {
                                                    console.log("start_query3 OK!");    
                                                });
                                            
                                            });
                                        }); 
                                }
                            
                            callback(calc); 
                
                    };
                    
                    
                    function mach2(callback){
                                    
                        mach1(function() {
                            
                            console.log("mach1 OK!");
                
                            for(...){                                                                                               
                            // do something                                                         
                            }   
                                                
                        });         
    
                        callback(calc,error_buy);
                        
                    };                          
                        
                    mach2(function() {
                    console.log("mach2 OK 2!");                                         
                    });

СТАРЫЙ ПОСТ:

Я пытаюсь прочитать данные из mongodb и отправить их обратно с обратным вызовом следующей функции, для продолжения которой требуется информация из базы данных.

Без функций чтения mongodb он работает отлично, но теперь я не знаю, как я могу отправить переменные базы данных из двух внутренних функций в первую функцию обратного вызова.

Надеюсь, кто-нибудь может мне помочь... Спасибо.

переменная ошибка = 0; вар вар1 = да, сэр;

функция start_query (обратный вызов) {

вар имя_базы_данных = db1;

db[db_name].find({name:var1},{data1:1, data2:1, data3:1, data4:1}, function(err, data_catch,callback) {
    
    if( err || !data_catch ) {
        console.log("Problem finding data_catch:" + err);
    
    } else {
        
        data_catch.forEach( function(data_catch_finder,callback) {
        
            data1_db = data_catch_finder.data1;
            data2_db = data_catch_finder.data2;
            data3_db = data_catch_finder.data3;
            data4_db = data_catch_finder.data4;
                                                            
            if(data1_db == "" || data2_db == "" || data3_db == "" || data4_db == ""){error = 1; console.log("Error: data_catch_finder");}
             
             callback(data1_db, data2_db, data3_db, data4_db, error);
     
        }); 
      
    }
});
        
        
    callback(data1, data2, data3, data4, error);
        
}
             
//########################################################################
 
 start_query(function() {
     
     function start_query2(callback) {
         
         console.log("DATA1 from callback:" + data1_db);
         console.log("DATA2 from callback:" + data2_db);
         console.log("DATA3 from callback:" + data3_db);
         console.log("DATA4 from callback:" + data4_db);
         
         var var_no_db = "testing";
         
         //do something else and callback
         
         callback(var_no_db);
         
     }
     
     
     start_query2(function() {
         
         console.log("Var from callback start_query2:" + var_no_db);
         console.log("The end");
     });
 });

Ответы:


1

ваша подпись обратного вызова выдает callback в качестве параметра.

Насколько я понимаю ваш код, вам нужно сохранить ссылку на первый обратный вызов, который вы получаете здесь: function start_query(callback).

В каждой функции обратного вызова вы сделали ошибку, привязав имя переменной callback к параметру из драйвера mongo (я думаю, что это просто undefined).

Вы можете исправить это, удалив каждую ссылку callback из подписи ваших внутренних функций.

простой пример:

function async (cb) {
  // params: Error, data
  cb(null, 'moo');
}

function foo(callback) {
  async(function(err, data, callback){
    console.log(callback); // undefined
  });

  console.log(callback); // Moo
}

foo('Moo');

Взгляните на Eloquent Javascript, чтобы лучше понять переключение контекста JS;


изменить

Единственный способ дождаться результатов асинхронной функции — вызвать первый обратный вызов внутри последнего вложенного обратного вызова.

function ugly_nested (callback) {
  dbquery('...', function(err, data_01) {
    if (!! err) return callback(err);

    dbquery('...', function(err, data_02) {
      if (!! err) return callback(err);

      dbquery('...', function(err, data_03) {
        if (!! err) return callback(err);

        callback(null, data_01, data_02, data_03);
      });
    });
  });
}

ugly_nested(function(err, data01, data02, data03) {
  if (!! err) throw err;

  manage_data(data01, data02, data03);
});

Цикл FOR является синхронным, но вызовы базы данных асинхронны, поэтому цикл for завершится до того, как база данных вернет его результаты. Если вам действительно нужен цикл for, вы можете попробовать один из хороших управления потоком. библиотеки out здесь

03.08.2012
  • Спасибо! Выкладываю пример рабочего кода, без db. Надеюсь, что лучше понять. ОА 04.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..