Как выполнить несколько обратных вызовов и вернуть массив результатов?
Я пытаюсь получить массив URL-адресов изображений внутри Dropbox в формате JSON. Для этого я написал следующую функцию:
router.get('/thumbnails', function(req, res, next){
var images = [];
var imagesCount = -1;
var isLoggedIn = !!req.user;
var dropboxClient = req.app.get('dropboxClient');
console.log(dropboxClient);
dropboxClient.authenticate({interactive: false}, function(error, client) {
if (error) {
console.log(error);
return 0
}
if (dropboxClient.isAuthenticated()) {
dropboxClient.readdir(dropboxConfig.folder, function(error, entries) {
if (error) {
console.log(error);
return 0
}
imagesCount = entries.length;
entries.forEach(function(entry){
var path = dropboxConfig.folder + '/' + entry;
dropboxClient.makeUrl(path, {download: true}, function(err, res){
if(err){
console.log(err);
return 0
}
//console.log(res.url);
images.push({url: res.url});
console.log("Processed " + images.length + "/" + imagesCount);
if(images.length == imagesCount){
console.log(images);
res.json(images);
}
});
});
});
}
});
});
Наблюдая за выводом консоли, я полагаю, что все URL-адреса загружаются в массив, но данные недоступны по адресу http:/thumbnails, и через некоторое время, при попытке загрузить данные в браузер, он возвращает ERR_EMPTY_RESPONSE,
Кто-нибудь знает, почему функция не возвращает данные?
1 ответ
Решение
dropboxClient.makeUrl(path, {download: true}, function(err, dbc_res){
if(err){
console.log(err);
return 0
}
//console.log(res.url);
images.push({url: dbc_res.url});
console.log("Processed " + images.length + "/" + imagesCount);
if(images.length == imagesCount){
console.log(images);
//res come from dropboxClient, not router.get!!!
res.json(images);
}
});
Проблема в том, что при res.json
, отвечаете на dropboxClient, а не на пользователя, вам нужно переименовать res
в dropboxClient.makeUrl(path, {download: true}, function(err, res){
Таким образом, пользователь получает свой ответ.