让 Cordova 等待异步钩子完成

Make Cordova wait for async hook to finish

在我的 Cordova 项目中,我有一个钩子可以在 after_prepare 上进行 RequireJS 优化 (r.js)。该优化本质上是异步的,因此我的钩子代码 returns 在所有优化完全完成之前。

例如,这会在 运行ning cordova run browser 时引起问题:在第一个页面加载时,优化尚未完成,网站看起来很糟糕。

有没有办法让 Cordovoa 构建过程阻塞,直到某个钩子触发回调?或者优化器可以 blocking/sync 的方式 运行 吗?

我能想到的一个替代方案是使用不同的优化过程,并在主要过程中忙等待它完成,但这对我来说似乎是一种矫枉过正和糟糕的做法。

您可以使用内置的 promise 模块阻止 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,您可以简单地从 module.exports 函数

中 return 一个 Promise
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;
};