#javascript #json #node.js #callback
#javascript #json #node.js #обратный вызов
Вопрос:
Мое приложение вызывает модуль для анализа вложенного объекта JSON для чтения значений 2 ключей.
parseData(str, function (error, str) {
if (err) {
console.log("Error - parseData : ", err);
} else {
console.log(str);
}
И модуль ParseData выглядит следующим образом
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)) {
parseData(value);
} else {
if (key == 'title') {
title = value;
}
if (key == 'extract') {
var extract = value.replace(/(rn|n|r)/gm," ");
callback(null, JSON.stringify('{"title":' title ', "text":' extract));
}
}
}
}
recursiveFunction(str);
}
Но он показывает следующую ошибку
/modules/parseData.js:22
callback(null, JSON.stringify('{"title":' title ', "text":' extract));
^
TypeError: callback is not a function
Почему происходит сбой обратного вызова? Как вернуть обратно объект JSON?
Редактировать
В коде были некоторые ошибки, которые теперь исправлены.
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') {
title = value;
}
if (key == 'extract') {
var extract = value.replace(/(rn|n|r)/gm," ");
callback(null, JSON.stringify('{"title":' title ', "text":' extract));
}
}
}
}
recursiveFunction(str);
};
Комментарии:
1. В вашем первом блоке кода отсутствуют a
}
и a)
; это ошибка или в вашей программе есть синтаксическая ошибка?2. добавить
callback
в качестве параметра при рекурсивном вызове функции3.
callback(null, JSON.stringify('{"title":' title ', "text":' extract));
выглядит очень неправильно. Если вы хотите создать правильный JSON, вы должны передать объектJSON.stringify
:callback(null, JSON.stringify({title: title, text: extract}));
. Но вы уверены, что хотите использовать JSON вместо объекта?4. @Jacob, я, должно быть, допустил какую-то ошибку при копировании кода
5. @FelixKling, мы можем вернуть объект обратно, но API отвечает JSON на вызывающий запрос. Нормально ли передавать JSON?
Ответ №1:
Вы вызываете parseData(value);
, а не передаете обратный вызов; передайте callback
, если вы хотите, чтобы использовался этот исходный обратный вызов.
Комментарии:
1. Я не понял. Я передаю функцию обратного вызова в ParseData(str, функция (ошибка, str)).
2. Вы вызываете
parseData
рекурсивно внутриparseData
, и этот внутренний вызов не передает обратный вызов.3. извините, в моем коде была ошибка, я опубликовал пересмотренный код в разделе основного вопроса. Здесь я рекурсивно вызываю recursiveFunction внутри ParseData. Итак, мне нужно изменить мой вызов для recursiveFunction, чтобы исходный обратный вызов передавался при вызове модуля ParseData. recursiveFunction(str, обратный вызов); Я прав?
4. То, как это написано сейчас, вы не должны получать ту же ошибку. Если у вас сейчас другие проблемы, возможно, вам следует задать другой вопрос.