4

私の Cordova プロジェクトには、RequireJS 最適化 (r.js) を実行するフックがありafter_prepareます。この最適化は本質的に非同期であるため、すべての最適化が完全に終了する前にフック コードが返されます。

たとえば、これにより、実行時に問題が発生しますcordova run browser。最初のページの読み込み時に、最適化がまだ完了しておらず、サイトが壊れているように見えます。

特定のフックがコールバックを起動するまで Cordovoa ビルド プロセスをブロックする方法はありますか? または、オプティマイザーをブロック/同期の方法で実行できますか?

私が考えることができる代替案は、最適化に別のプロセスを使用し、主にそれが完了するまでビジー待機することですが、それはやり過ぎで悪い習慣のように思えます。

4

2 に答える 2

6

組み込みの 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;
};
于 2016-12-11T17:33:41.933 に答える
0

を呼び出す必要はありません。関数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;
};
于 2020-09-21T11:06:15.843 に答える