У меня есть скрипт сборки, который в один момент принимает все атрибуты src и href со значением, начинающимся с w / src = '. / Src, и преобразует их в файл src ='. / В файле index.js для Связанный с аккаунтом index.js перемещен из / src / в / dist / папку. Проблема, с которой я сталкиваюсь, заключается в том, что процесс связывания является асинхронным, и я использую обещания, чтобы принять это во внимание, но сборка работает не так, как ожидалось. Соответствующие части bundle.js:
// =========== Build the browserify bundle using the browserify api ========== //
// First check if index.js exists
/* jshint ignore:start */
const browserifyJS = async function(result) {
try {
console.log(result); // output result from previous async function uglifyJS
console.log("Checking for index.js");
await open("index.js", "r");
console.log("/dist/index.js: build and uglify");
// Browserify API calls
let b = require("browserify")();
b.add("index.js");
await b.transform("uglifyify", { global: true });
let indexjs = fs.createWriteStream("dist/index.js");
// Bundle the files and their dependencies into a
// single javascript file.
await b.bundle().pipe(indexjs);
.
return "========== Browserify JavaScript Bundling Successful!!! ===============";
} catch (err) {
console.log("ERROR: " + err);
}
}; // End of browserifyJS
/* jshint ignore:end */
// ============== End Browserify Build ========================================//
// Чем больше материалов, тем больше
// ====== updateFileLinks (Read and update links from dist/index.html, main.css, and index.js if necessary) ============ //
/* jshint ignore:start */
const UpdateFileLinks = async function() {
try {
await updateLinks("index.html");
await updateLinks("main.css");
await updateLinks("index.js");
} catch (err) {
console.log("ERROR:", `err ${warning}`);
}
};
/* jshint ignore:end */
// =================== End updateLinks =============================== //
Когда мы вызываем updateLinks.js, browserify не завершил связывание index.js, и изменения ссылки не увенчались успехом. Файл записи или файл чтения не выдает никаких ошибок для проверки, что я тоже считаю странным. Единственный способ заставить писатель работать - в цепочке обещаний, используя тайм-аут установки kludge, например:
// ==================================================== //
// ========== Call promise chain ====================== //
// ==================================================== //
uglifyJS()
.then(result => {
return browserifyJS(result);
})
// bunch of then's
.then(result => {
return miscOperations(result);
})
.then(result => {
console.log(result);
console.log(`Pause for index.js to bundle and finish \u270B`);
setTimeout(() => { // I know this is a kludge!!
return UpdateFileLinks();
}, 7000);
})
.catch(function(error) {
console.err(error);
});
Я, очевидно, не понимаю асинхронные операции так, как я думал. b.bundle и b.transform не отвечают на ожидание, как я и думал. Любая помощь в рефакторинге это будет оценено. Заранее спасибо.
P.S. - Бонусный ответ. Есть ли способ сделать это без написания моего собственного метода для обновления ссылок? Я использую только npm-скрипты, но никаких исполнителей задач. Поиск по репозиторию npm ничего не вывел:)