2016-05-09 9 views
1

Я пытаюсь обернуть свою голову вокруг рисования линии между прослушивающими событиями/обработчиками событий и разрешением обещания с помощью angularjs.addEventListener и angularjs обещание: оберните его

Я использую PreloadJS в сервисе angularjs, занимающемся аудио.
Эта служба используется как зависимость для другой службы, которая должна иметь возможность выполнять некоторые действия после предварительной загрузки файлов (отсюда и использование обещания).

Но я понятия не имею, оставленного на том, чтобы обернуть его все вместе ...

Таким образом, классический бит кода:

// Event handlers 
audio.queue.addEventListener('fileload', function(event) { 
    console.log('charging file', event); 
    // do some things while loading (.notify) 
}); 

audio.queue.addEventListener('complete', function(event) { 
    console.log('file loaded', event); 
    // do some things once it's loaded (.resolve) 
}); 

audio.queue.addEventListener('error', function(event) { 
    console.log('error while charging file', event); 
    // do some things in case of error (.reject) 
}); 

// Preload a file 
audio.queue.loadFile({id: 'test', src: 'test.mp3'}); 

Что я мог сделать?
A. $ q.all по массиву обещаний, поданных тремя обратными вызовами?
B. У меня нет B ... будут оценены

Любая помощь или приводит

EDIT:

В ответ на C14L answer. Допустим, мы имеем:

var file1 = 'test.mp3' //file exists 
var file2 = 'azepsl.mp3' //file doesnt exist 
var file3 = 'test2.mp3' //file exists 

с C14L code я получил 3 обещание отклоненного из 1 файл, который не существует.
Если я использую простой старый eventHandler, как показано выше, я получил 2 события успеха и 1 сбой (что довольно нормально).

Что может быть причиной этой проблемы?
Может ли это быть из-за нескольких eventListeners, добавленных в audio.queue?

ответ

3

Похоже, fileload пожаров во время загрузки файла, поэтому не нужно, если вы хотите обрабатывать файл после скачать. Вам нужны только complete и error. Можно завернуть, что в обещании

function download_me_stuff(){ 
    audio.queue.loadFile({id: 'test', src: 'test.mp3'}); 

    return new Promise(function (resolve, reject) { 
    audio.queue.addEventListener('complete', function(event) { 
     console.log('file loaded', event); 
     resolve(event); 
    }); 
    audio.queue.addEventListener('error', function(event) { 
     console.log('error while charging file', event); 
     reject(event); 
    }); 
    } 
} 

Теперь его thenable

download_me_stuff().then(
    function do_me_things (event) { 
     // ... 
    }, 
    function handle_me_error (event) { 
     // ... 
    } 
); 

Было ли это то, что вы просили? Возможно, я неправильно понял.


Edit:

Я посмотрел на fileload spec и, похоже, это событие вызывается каждый раз, когда один отдельный файл из очереди успешно завершена загрузка.

audio.queue.addEventListener('fileload', function(event) { 
    console.log('one more file loaded', event); 
}); 

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

audio.queue.loadFile({id: 'test1', src: 'test1.jpg'}); 
audio.queue.loadFile({id: 'test2', src: 'test2.jpg'}); 
audio.queue.loadFile({id: 'test3', src: 'test3.jpg'}); 

Вы, вероятно, хотите, чтобы реагировать каждый раз, когда один файл был загружен и делать вещи с этим одним файлом. Хотя вы можете обернуть это в индивидуальные обещания, это просто усложнит материал. Лучше просто определить для выполнения обратного вызова

audio.queue.addEventListener('fileload', oneSingleFileLoaded); 

function oneSingleFileLoaded(event) { 
    var id = event.item.id; // 'id' of this item from loadFile() above 
    var type = event.item.type; 

    if (type == createjs.LoadQueue.IMAGE) { 
    document.getElementById('#'+id).appendChild(event.result); 
    } 
} 

Остальные два события просто для удобства, чтобы вы знали, если вся очередь была успешно загружена или нет. Вероятно, это не так важно в большинстве случаев

audio.queue.addEventListener('complete', function(event) { 
    alert('Wohooo, everything downloaded successfully!') 
}); 

audio.queue.addEventListener('error', function(event) { 
    alert("Well, that didn't work. Hit [F5] and try again!"); 
}); 
+0

Благодарим за помощь и синтаксис создания обещания, которого я не знал. Но, к сожалению, это не полностью устраняет проблему, как объяснялось в моем редактировании. –

Смежные вопросы