2016-10-24 4 views
0

Эта программа считывает через вложенный объект, который ищет определенный ключ & значений. Как только эти данные будут найдены, он должен инициировать обратный вызов для отправки данных. Объект выглядит следующим образом:Переменная область и проблемы с обратным вызовом

{ 
    "name": "joel", 
    "title": "CTO", 
    "edu": { 
     "school": "RMB", 
     "college": "GNK", 
     "pg": "CDAC", 
     "extract": "This is a large text ..." 
    } 
} 

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

function parseData(str, callback) { 

    function recursiveFunction(obj) { 
     var keysArray = Object.keys(obj); 

     for (var i = 0; i < keysArray.length; i++) { 
      var key = keysArray[i]; 
      var value = obj[key]; 

      if (value === Object(value)) { 
       recursiveFunction(value); 
      } 
      else { 
       if (key == 'title') { 
        var title = value; 
       } 

       if (key == 'extract') { 
        var extract = value.replace(/(\r\n|\n|\r)/gm," "); 
        callback(null, JSON.stringify({title: title, text: extract})); 
       } 
      } 
     } 
    } 

    recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract}))); 
}; 

когда код выполнен, мы получаем следующую ошибку:

/parseData.js:29 
    recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract}))); 
                  ^
ReferenceError: title is not defined 
+0

Это очень трудно ответить на этот вопрос, не видя объект ввода данных и желаемого результата. Поскольку он стоит прямо сейчас, функция не имеет большого смысла. – Tomalak

+0

@Tomalak данных JSON будет как этот { "имя": "Joel", "название": "КТО", "Эду": { "школа": "ПКМ", "колледж" : "ГНК", "пг": "CDAC", "экстракт": "Это большой текст ..." }} и желаемый результат будет { "название": " CTO ", " extract ":" Это большой текст ... " } –

+0

И каково желаемое поведение/результат? Вы не указали, что должна делать функция. Кроме того, как утверждает @Svabael ниже, до сих пор это не имеет никакого отношения к асинхронному программированию. – Tomalak

ответ

0

Хорошо. Таким образом, вам нужна функция, которая извлекает первое свойство с именем title и первое свойство с именем extract из вложенного объекта, независимо от того, насколько глубоко вложены эти свойства.

«Извлечь значение свойства из объекта» в основном является самостоятельной задачей, мы могли бы написать для нее функцию.

Есть три случая ручки:

  1. Аргумент не является объектом - вернуть undefined
  2. Аргумент содержит ключ в вопросе - возвращает соответствующее значение
  3. В противном случае, рекурсию в объект и повторите шаги 1 и 2 - деклараций по результату

это может выглядеть следующим образом:

function pluck(obj, searchKey) { 
    var val; 

    if (!obj || typeof obj !== "object") return; 
    if (obj.hasOwnProperty(searchKey)) return obj[searchKey]; 
    Object.keys(obj).forEach(function (key) { 
     if (val) return; 
     val = pluck(obj[key], searchKey); 
    }); 
    return val; 
} 

Теперь мы можем позвонить pluck() на любом объекте и с любым ключом, и он вернет нам первое значение, которое он найдет в любом месте объекта.

Теперь остальная часть вашей задачи становится очень легко:

var obj = { 
    "name": "joel", 
    "title": "CTO", 
    "edu": { 
     "school": "RMB", 
     "college": "GNK", 
     "pg": "CDAC", 
     "extract": "This is a large text ..." 
    } 
} 

var data = { 
    title: pluck(obj, "title"), 
    text: pluck(obj, "extract") 
}; 
0

Эта функция, которую вы указали выше, не имеет никакого отношения к асинхронному программированию. Я отвечу в контексте фрагмента кода, который вы опубликовали. Ошибка, вызванная тем, что вы вызываете recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract})));, но переменная title нигде не определена. Я вижу определение title, но оно находится в контексте функции recursiveFunction. Переменные, которые вы определяете там, не видны за пределами области действия этой функции, и именно поэтому у вас есть эта ошибка.

Вы пытаетесь сделать что-то странное в этой строке: recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract})));

Эта линия будет вызывать обратный вызов и будет проходить в recursiveFunction результатов этой функции. Я ожидаю увидеть что-то подобное в этой строке: recursiveFunction(str, callback);