4

在我的 Cordova 项目中,我有一个在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,你可以简单地从module.exports函数中返回一个 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;
};
于 2020-09-21T11:06:15.843 回答