让 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;
};
在我的 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
函数
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;
};