Async не работает должным образом при объединении с Browserify - PullRequest
0 голосов
/ 29 октября 2018

У меня есть скрипт сборки, который в один момент принимает все атрибуты 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 ничего не вывел:)

...