Заставить Кордову дождаться окончания асинхронного хука

В моем проекте 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;
};
Другие вопросы по тегам