Примечание. Этот вопрос также перекрестно размещен в списке рассылки Q.js по здесь.
У меня была ситуация с несколькими асинхронными операциями, а ответ, который я принял, указал, что использование Promises с использованием библиотеки, такой как q.js, будет более выгодным.
Я убежден, что рефакторинг моего кода используется для использования Promises, но поскольку код довольно длинный, я обрезал нерелевантные части и экспортировал важнейшие части в отдельное репо.
Репо здесь, а самым важным файлом является this.
Требование состоит в том, что я хочу, чтобы pageSizes был непустым после прохождения всех выгруженных файлов.
Проблема в том, что операции FileAPI внутри функции getSizeSettingsFromPage приводят к асинхронному getSizeSettingsFromPage.
Поэтому я не могу разместить checkWhenReady(); как это.
function traverseFiles() {
for (var i=0, l=pages.length; i<l; i++) {
getSizeSettingsFromPage(pages[i], calculateRatio);
}
checkWhenReady(); // this always returns 0.
}
Это работает, но это не идеально. Я предпочитаю называть checkWhenReady только один раз после того, как все pages
претерпели эту функцию calculateRatio успешно.
function calculateRatio(width, height, filename) {
// .... code
pageSizes.add(filename, object);
checkWhenReady(); // this works but it is not ideal. I prefer to call this method AFTER all the `pages` have undergone calculateRatio
// ..... more code...
}
Как мне реорганизовать код, чтобы использовать Promises в Q.js?