Показать сообщение отдельно
  #6 (permalink)  
Старый 10.05.2024, 02:54
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,514

pvv, не особо разобрал твой вопрос но:
Обычные скритпы которые ни от чего не зависят и от которых ничего не зависит - не трогать.
Обычные скрипты от которых кто-то зависит - ставить вверх в нужном порядке.
Скрипты с чем-то асинхронным которые ни от чего не зависят и от которых ничего не зависит - не трогать.
Скрипты с чем-то асинхронным от которых кто-то зависит - возвращать в конце промис ждущий исполнения и имеющий конкретное имя(от которого и будут зависеть последующие). Промис возвращать либо как глобальную переменную в обычном скрипте, либо как экспорт в модуле.
Скрипты с чем-то асинхронным которые от чего-то зависят - await'ить зависимости по имени перед исполнением.
Скрипты с чем-то асинхронным которые от чего-то зависят И от которых кто-то зависит - await'ить зависимости по имени перед исполнением И возвращать в конце промис ждущий исполнения и имеющий конкретное имя(от которого и будут зависеть последующие). Промис возвращать либо как глобальную переменную в обычном скрипте, либо как экспорт в модуле.


Но чтоб совсем не париться - вот тебе на коленке накидал систему работы с асинхронными зависимостями не зависящую от порядка:
{
// top-script.js
this.dependencies = {
  table: {},

  get(name) {
    if (Array.isArray(name)) return Promise.all(name.map(n => this.get(n)));
    return this.table[name] ??= dependenciesProxyPromise();
  },

  set(name, truePromise) {
    const existingPromise = this.table[name];

    if (existingPromise) {
      const attach = existingPromise[dependenciesProxyPromise.attach];

      if (!attach) throw new Error(`[duplicate dependency declaration: ${name}]`);

      attach(truePromise);
    } else {
      this.table[name] = truePromise;
    }

    return this;
  },
};


function dependenciesProxyPromise() {
  let resolve, reject;

  const promise = new Promise((res, rej) => {
    resolve = res;
    reject = rej;
  });

  promise[dependenciesProxyPromise.attach] = (truePromise) => {
    truePromise.then(resolve, reject);

    delete promise[dependenciesProxyPromise.attach];

    return promise;
  };;

  return promise;
}
dependenciesProxyPromise.attach = Symbol('attach');


// просто для удобства
const delay = (ms) => new Promise(r => setTimeout(r, ms));;


// first.js
console.log('first file start');

// ...
const first = async () => {
  console.log('first proxy start');
  await delay(3000);
  console.log('first proxy end');
};
dependencies.set('first', first());

console.log('first file end')


// second.js
console.log('second file start');

async function second() {
  console.log('second proxy start');
  const  third = await dependencies.get('third');
  
  // ...
  
  await delay(1000);
  console.log('second proxy end');
}
dependencies.set('second', second());

console.log('second file end');


// main.js
console.log('main file start');
async function main() {
  const [ first, second, third ] = await dependencies.get(['first', 'second', 'third']);
  
  // ...
  
  console.log('main file after all dependencies end');
}
main()
console.log('main file end');


// third.js
console.log('third file start');

const third = async () => {
  console.log('third proxy start');
  await delay(3000);
  console.log('third proxy end');
}
// ...
dependencies.set('third', third());

console.log('third file end');

}
__________________
29375, 35

Последний раз редактировалось Aetae, 10.05.2024 в 04:11.
Ответить с цитированием