Как динамически сопоставить массив с функциями асинхронности или синхронизации?

#javascript

Вопрос:

Предположим, у меня есть следующий массив:

 const routes = [
    { isAsync: true },
    { isAsync: false },
    { isAsync: true },
]
 

Как я могу сопоставить это с функциями асинхронности или синхронизации? Что-то вроде следующего не работает:

 routes.map(({ isAsync }, index) =>
     [isAsync ? 'async' : ''] () => { console.log('isAsync: ', isAsync, index) })
 

Я мог бы что-то вроде,

 routes.map(({ isAsync }, index) =>
     isAsync
          ? async () => { console.log('isAsync: ', isAsync, index) }
          : () => { console.log('isAsync: ', isAsync, index) })
 

Но мне интересно, возможно ли сделать это так, как я пытаюсь в первом примере?

Комментарии:

1. Я думаю, что второй вариант с именованной функцией (чтобы избежать дублирования), вероятно, является лучшим решением, хотя будет интересно, если кто-нибудь знает способ.

Ответ №1:

Я согласен с комментарием @DBS, что ваш второй вариант выглядит просто отлично. Тем не менее, для полноты картины, вот решение:

 const AsyncFunction = Object.getPrototypeOf(async function() {}).constructor
const routes = [{
    isAsync: true
  },
  {
    isAsync: false
  },
  {
    isAsync: true
  },
];
const funcWithParams = routes.map(({
  isAsync
}, index) => new Object({
  'func': (isAsync ? Function : AsyncFunction).apply(this, ['isAsync', 'index', `console.log('isAsync: ', isAsync, index)`]),
  'isAsync': isAsync,
  'index': index
}));
funcWithParams.forEach((funcWithParam) => funcWithParam.func(funcWithParam.isAsync, funcWithParam.index)); 

Объяснение:

Что касается функций, в документации говорится:

Каждая функция JavaScript на самом деле является Function объектом

И почти то же самое для асинхронной функции:

В JavaScript каждая асинхронная функция на самом деле является AsyncFunction объектом.

С дополнительной запиской:

Обратите внимание, что функция AsyncFunction не является глобальным объектом. Его можно получить с помощью следующего кода: Object.getPrototypeOf(async function(){}).constructor

Ваше требование для динамического построения функции / асинхронной функции возможно, если вы вызовете конструктор каждого прототипа. чтобы этого достичь, назовите это с. apply

Ответ №2:

 const routes = [{
    isAsync: true
  },
  {
    isAsync: false
  },
  {
    isAsync: true
  },
];

const result = routes.map(function({
  isAsync
}, index) {
  return isAsync ? this.async_fn.bind(null, isAsync, index) : this.fn.bind(null, isAsync, index)
}, {
  fn: (isAsync, index) => {
    console.log('isAsync:', isAsync, index)
  },
  async_fn: async(isAsync, index) => {
    console.log('isAsync:', isAsync, index)
  },
});