让Cordova等待异步挂钩完成

时间:2016-12-11 12:11:40

标签: node.js cordova requirejs requirejs-optimizer

在我的Cordova项目中,我有一个钩子,它在<template> <div class="container"> <navigation :authenticated="authenticated"></navigation> <main> .... .... 上执行RequireJS优化(r.js)。该优化本质上是异步的,因此我的钩子代码在所有优化完全完成之前返回。

例如,这会在运行after_prepare时导致问题:在首页加载时,优化尚未完成,网站看起来已损坏。

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

我能想到的一个替代方案是使用不同的优化过程和忙碌等待它完成,但这看起来像是一种矫枉过正和不好的做法。

2 个答案:

答案 0 :(得分:5)

您可以使用内置的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;
};

答案 1 :(得分: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;
};