Заставить Кордову дождаться окончания асинхронного хука
В моем проекте Cordova у меня есть хук, который выполняет оптимизацию RequireJS (r.js) на after_prepare
, Эта оптимизация изначально асинхронна, поэтому мой код возврата возвращается до того, как вся оптимизация будет полностью завершена.
Например, это вызывает проблемы при запуске cordova run browser
: При загрузке первой страницы оптимизация еще не завершена, и сайт выглядит неработающим.
Есть ли способ заставить процесс сборки Cordovoa блокировать до тех пор, пока определенный хук не вызовет обратный вызов? Или оптимизатор может работать в режиме блокировки / синхронизации?
Альтернатива, о которой я мог бы подумать, - это использовать другой процесс для оптимизации и занятое ожидание в основном для его завершения, но для меня это выглядит излишним и плохой практикой.
1 ответ
Вы можете использовать встроенный модуль обещаний, чтобы заблокировать выполнение Cordova до тех пор, пока ловушка не будет устранена. Что-то вроде этого:
#!/usr/bin/env node
var deferral;
function doSomethingAsync(){
somethingAync
.success(function(){
deferral.resolve();
})
.fail(function(err){
deferral.reject(err);
});
}
module.exports = function(ctx) {
deferral = ctx.requireCordovaModule('q').defer();
doSomethingAsync();
return deferral.promise;
};
Вам не нужно звонить
context
, вы можете просто вернуть Promise из
module.exports
функция
module.exports = context => {
return new Promise(resolve => {
setTimeout(() => resolve(), 1000);
});
};
Я протестировал, и все работает. Проблема возникает из-за того, что в версиях Cordova => 9 вы не можете использовать
context.requireCordovaModule('q')
Если вы не хотите использовать Promise, просто сделайте
module.exports = context => {
var deferral = require('q').defer();
doSomethingAsync(() => {
deferral.resolve();
});
return deferral.promise;
};