setTimeout. Помогите решить проблемку. Куча запросов к API VK.
Всем здравствуйте. Только начинаю изучать JS, и вот хочу сделать скроблер с spotify to vk. Надо сделать кучу запросов к апи и расставить таймеры. Голова уже кипит, сделал через callback и setTimeout, но весь код выполняется в одно время.
// Запускаем поиск, добавление, редактирование трека. // artist - Имя артиста, track - название композиции // user_id - id пользователя в ВК engine(artist, track, user_id); // Первые таймауты я сделал тут, думал заработают. // Но что-то не работают. // Это объект с запросами к vk. vk = { searchAudio: function(artist, title, callback) { setTimeout(function() { q = artist + ' ' + title; VK.Api.call('audio.search', { q: q }, function(e) { return callback(e); }); }, 333); }, addAudio: function(audio_id, owner_id, callback) { setTimeout(function() { VK.Api.call('audio.add', { audio_id: audio_id, owner_id: owner_id }, function(e) { return callback(e); }); }, 333); }, editAudio: function(owner_id, audio_id, title, callback) { setTimeout(function() { VK.Api.call('audio.edit', { owner_id: owner_id, audio_id: audio_id, title: title }, function(e) { return callback(e); }); }, 333); }, addToAlbum: function(album_id, audio_ids, callback) { setTimeout(function() { VK.Api.call('audio.moveToAlbum', { album_id: album_id, audio_ids: audio_ids }, function(e) { return callback(e); }); }, 333); }, } // А вот сам двигатель прогресса // вторые таймеры я уже тут поставил, но тоже не работают. // Голова уже кипит. // Я понимаю что можно сделать все красивее, но пока мозгов не хватает. // Направьте пожалуйста на верный путь. // Естественно надо будет еще доделать обработчик ошибок, чтоб если // вылетает капча, можно было ее ввести и продолжить, но пока пытаюсь // решать проблему с временем запуска. function engine(artist, title, user_id, album_id) { user_id = user_id || 176527444; album_id = album_id || 58194499; vk.searchAudio(artist, title, function(e) { if (e.response) { e = e.response; for (key in e) { if (key > 0) { t = e[key]; var title = t.title; setTimeout(function() { vk.addAudio(t.aid, t.owner_id, function(e) { if (e.response) { ids = e.response; var newTitle = title + ' [SPOTIFY]'; setTimeout(function() { vk.editAudio(user_id, ids, newTitle, function(e) { if (e.response) { setTimeout(function() { vk.addToAlbum(album_id, ids, function(e) { if (e.response) { console.log('Ok'); } else { error = e.error; console.log(error.error_code + ' ' + error.error_msg); } }); }, 333); } else { console.log('Error 3:'); console.log(e); } }); }, 333); } else { console.log('Error 2:'); console.log(e); } }); }, 333); } } } else { console.log('Error 1:'); console.log(e); } }); } Буду рад любым дельным советам. |
прочитай про промисы и используй.
или прочитай про паттерн "продолжение" и используй и про замыкания прочитай а ещё про var внутри for-in циклов и про асинхронность ) |
Часовой пояс GMT +3, время: 04:13. |