#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)
},
});