2017-02-11 5 views
0

Я все еще n00b с NodeJS, поэтому этот вопрос может быть несколько элементарным.NodeJS + MongoJS: Вложенные обратные вызовы

Я использую MongoJS для чтения двух логически связанных коллекций. Первый find() возвращает значение, которое я передаю второму find(), чтобы получить необходимую информацию.

Я пробовал несколько стратегий, последний (фрагмент №1), являющийся классом, который я экспортирую.

До этого у меня была функция, которая сделала return, возвращая требуемое значение, то есть «config [0]».

В этом коде все, что я сделал, было установлено атрибутом «sapConfig» для слова «test», но когда я выполняю этот код, значение «sapConfig» всегда «null» после вызова «get_config()», метод и - самый странный из всех - ссылка на «this.sapConfig = 'test» генерирует ошибку, т. е. «Невозможно установить свойство« sapConfig »неопределенного».

Когда я код так же, как простая функция с возвратом заявлением (2 фрагмента кодом #), никаких ошибок не были получены, но возвращаемое значение всегда «неопределенное» хотя console.log() заявления показывают, что значение возвращаемой переменной имеет желаемое значение. Что дает?

фрагмент кода # 1: Возвращает объект

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 

    this.regKey = regKey; 
    this.sapConfig = null; 

    this.get_config = function() { 

     // Read SAP connection information from our MONGO db 
     var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']); 

     db.Registrations.find({ key: this.regKey }, function(err1, registration){ 
      console.log('Reg.find()'); 
      console.log(registration[0]); 
      db.Configurations.find({ type: registration[0].type }, function(err2, config){ 
       console.log('Config.find()'); 
       console.log('config=' + config[0].user); 
       this.sapConfig = 'test'; 
      }); 
     }); 
    } 

    this.get_result = function() { 
     return this.sapConfig; 
    } 
} 

Опять же, код сниппета # 1, когда я делаю вызов «Get_Config()», приводит к ошибке, когда он выполняет строку "this.sapConfig = 'test'".

Однако после этой ошибки я могу выполнить «obj.get_result()», и я получаю значение, для которого оно было инициализировано, т. Е. Null. Другими словами, тот же код не генерирует ошибку о том, что «это» не определено, как .в на «Get_Config()» метод

фрагмент кода # 2: Использование «возвращение» заявление

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 

     // Read SAP connection information from our MONGO db 
     var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']); 

     db.Registrations.find({ key: regKey }, function(err1, registration){ 
      console.log('Reg.find()'); 
      console.log(registration[0]); 
      db.Configurations.find({ type: registration[0].type }, function(err2, config){ 
       console.log('Config.find()'); 
       console.log('config=' + config[0].user); 
       return config[0].user; 
      }); 
     }); 
} 

Когда я получаю возвращаемое значение и проверяю его, он «не определен». Например, в узле CL I следующие команды:

var config = require('./config') // The name of the module above 
> var k = config('2eac44bc-232d-4667-bd24-18e71879f18c') 
undefined <-- this is from MongoJS; it's fine 
> Reg.find() <-- debug statement in my function 
{ _id: 589e2bf64b0e89f233da8fbb, 
    key: '2eac44bc-232d-4667-bd24-18e71879f18c', 
    type: 'TEST' } 
Config.find() 
config=MST0025 
> k <-- this should have the value of "config[0]" 
undefined 

Вы можете увидеть, что запросы были успешными, но значение «К» является «неопределенным». Что тут происходит?

Мне все равно, какой подход я использую. Мне просто нужен один из них для работы.

Заранее благодарен!

+0

См. Мой новый пример в ответе на вторую часть :) Привет. – matt

ответ

0

this.sapConfig недоступен. Это потому, что this относится к текущей функции. Мне нравится todo, есть переменная, которая ссылается на экземпляр функции, который вы знаете. sapConfig находится в.

Ex:

function Foo() { 
    var self = this; 

    this.test = "I am test"; 

    var bar = function(){ 
    return function(){ 
     console.log(this.test); //outputs undefined (because this refers to the current function scope) 
     console.log(self.test); //outputs "I am test"; 
    } 
    } 
} 

Вот ваш первый код Snippit с моим примером внедрен:

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 
    var self = this; 

    this.regKey = regKey; 
    this.sapConfig = null; 

    this.get_config = function() { 

    // Read SAP connection information from our MONGO db 
    var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']); 

    db.Registrations.find({ key: this.regKey }, function(err1, registration) { 
     console.log('Reg.find()'); 
     console.log(registration[0]); 
     db.Configurations.find({ type: registration[0].type }, function(err2, config) { 
     console.log('Config.find()'); 
     console.log('config=' + config[0].user); 
     self.sapConfig = 'test'; 
     }); 
    }); 
    } 

    this.get_result = function() { 
    return self.sapConfig; 
    } 
} 

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

Вот как я хотел возвращать значения из вложенных обратных вызовов:

Ex2:

//Function example 
var functionWithNested = function(done) { 
    //Notice the done param. 
    // It is going to be a function that takes the finished data once all our nested functions are done. 

    function() { 
    //Do things 
    function() { 
     //do more things 
     done("resultHere"); //finished. pass back the result. 
    }();//end of 2nd nested function 
    }(); //end of 1st nested function 
}; 

//Calling the function 
functionWithNested(function(result) { 
    //Callback 
    console.log(result); //resultHere 
}) 

Вот ваш код, используя этот пример:

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey, done) { 

    // Read SAP connection information from our MONGO db 
    var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']); 

    db.Registrations.find({ key: regKey }, function(err1, registration) { 
    console.log('Reg.find()'); 
    console.log(registration[0]); 
    db.Configurations.find({ type: registration[0].type }, function(err2, config) { 
     console.log('Config.find()'); 
     console.log('config=' + config[0].user); 
     done(config[0].user); 
    }); 
    }); 
} 

//Then wherever you call the above function use this format 
// if config is the name of the function export above... 

new Config().(regKey, function(result){ 

    console.log(result); //config[0].user value 
}) 

Много и много кода, но я надеюсь, что вы смогли это сделать. Позвольте мне знать, если у вас есть еще вопросы! Приветствия.

+0

Отлично! Работала как шарм, и теперь, когда вы объяснили это, это имеет смысл. Вы знаете, почему другой фрагмент возвращался «неопределенным», т. Е. Почему оператор ** return ** не работал должным образом? – Ishmael

+0

Рад, что это имело смысл для вас. Для вашей проблемы с возвратом: вы не можете вернуть значение из вложенного обратного вызова. Ill добавьте еще один пример того, как мне нравится возвращать мои значения из вложенных обратных вызовов. Просто дай немного :) – matt

+0

Да! Отлично! Это имеет смысл. Я не думал «асинхронно». Отличная информация. Спасибо огромное! – Ishmael

Смежные вопросы