Я работаю над async.waterfall, что я не уверен, как этого избежать: «TypeError: Невозможно прочитать свойство« MediaUrl »undefined». Этот TypeError не возникает при каждом запуске скрипта.Как избежать async.waterfall "TypeError: Невозможно прочитать свойство неопределенного"?
поток выглядит следующим образом:
- GetName (случайным образом выбирает имя из списка имен
- searchImage (использует поиск Bing API для поиска фотографий, связанных с этим именем
- processBotdata (принимает результаты от Bing и случайным образом выбирает один из результатов поиска)
Шаг 3, где происходит выпуск:
function processBotdata (searchData, callback) {
var photographer = searchData.photographer // the search name
var array = searchData.array; // search results from bing
var randomIndex = Math.floor(Math.random() * array.length);
var mediaUrl = array[randomIndex].MediaUrl; // TypeError here!
var sourceUrl = array[randomIndex].SourceUrl;
var searchData = {
photographer,
mediaUrl,
sourceUrl
};
fs.readFile('results.json', function (err, data) {
var json = JSON.parse(data);
json.push(['search results for ' + photographer + ': ',
'mediaUrl: ' + searchData.mediaUrl,
'sourceUrl: ' + searchData.sourceUrl]);
fs.writeFile("results.json", JSON.stringify(json, null, "\t"));
console.log(' ==========> searchData appended to results.json file...')
});
console.log(' ==========> searchData has now been processed for upcoming tweet...');
setTimeout(function() {
callback(null, searchData);
console.log(searchData);
}, 5000);
}
Я реализовал setTimeout
для этой функции, надеясь, что это решит проблему. Я думал, что результаты Bing searchData.array
еще не были доступны для обработки, т. Е. Рандомизированы и выбраны в этой функции. Поскольку я новичок в Node.js и JavaScript, я не уверен в своей ошибке программирования здесь. Я видел это post, и мне интересно, связано ли это с массивом поиска Bing, который возвращает 50 лучших результатов.
Обновление: вот как async.waterfall
называется:
async.waterfall([
getName,
async.retryable([opts = {times: 5, interval: 500}], searchImage),
async.retryable([opts = {times: 3, interval: 1000}], processBotdata),
async.retryable([opts = {times: 3, interval: 500}], getImage)
],
function(error, result) {
if (error) {
console.error(error);
return;
}
});
Как вы называете эту функцию 'processBotdata'? Возможно, вы вызываете обратный вызов до получения результата. – rcdmk
Я обновил свое оригинальное сообщение, чтобы помочь уточнить. Я использую требуемый шаблон здесь https://github.com/caolan/async#waterfall – filmplane
Что возвращает 'console.log()' on 'searchData' внутри функции' processBotdata() '? – rcdmk