Как условно вызвать асинхронную функцию в JavaScript - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы сделать условный асинхронный вызов функции в JavaScript / ES5.

Скажем, у меня есть модуль myService с функцией myAsyncFunction, которая выполняет некоторую логику внутри и возвращает результат с обратным вызовом, как показано ниже:

myService.myAsyncFunction(param1, param2, (error, success) => {
    if (error) {
        // handle error
        return;
    }
    // handle success
});

Но в определенных условиях мне бы хотелось, чтобы он напрямую попадал в «дескриптор успеха» без запуска логики внутри myService.myAsyncFunction, что может занять некоторое время и ресурсы.

Самый простой способ, который я представляю, - создать фиктивную функцию, которая имитирует myService.myAsyncFunction и вызывает обратный вызов без ошибок, как показано ниже:

var myGenericFunction;

if ( /* I would like to skip unnecessary logic */) {
    myGenericFunction = function (param1, param2, callback) {
        callback(null);
    }
} else {
    myGenericFunction = myService.myAsyncFunction;
}

myGenericFunction(param1, param2, (error, success) => {
    if (error) {
        // handle error
        return;
    }
    // handle success
});

Это то, чем я закончил, но я думаю, что должен быть лучший способ с точки зрения как синтаксиса, так и производительности. Есть ли у вас какие-либо предложения для этого?

Примечание: Promise.resolve на ES6 может предложить решение, которое напрямую попадет в успех, но мне интересно, каким будет решение ES5.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я могу придумать пару альтернативных подходов к реализации собственной реализации Promise.

Вы можете использовать существующий, например, Bluebird - http://bluebirdjs.com/docs/getting-started.html

Вы также можете использовать транспортер, такой как Babel, который позволит вам написать все ES следующего поколения, которые вы пожелаете, и преобразовать их в ES5 до запуска - https://babeljs.io/docs/en

0 голосов
/ 05 сентября 2018

Во-первых, очень просто использовать Promise полизаполнение для сред JavaScript, которые его не поддерживают. Это должно работать вплоть до Ecmascript 3.

Игнорирование этого, если у вас есть такая асинхронная функция:

function myAsync(arg1, callback) {

}

Но для некоторого значения или arg1 вы хотите немедленно вызвать обратный вызов, но вы не можете изменить функцию, разумный способ сделать это - просто обернуть ее:

function myAsyncWrapped(arg1, callback) {
   if (arg1 === SOME_VALUES) {
     callback(null, true);
   } else {
     myAsync(arg1, callback);
   }
}

Если вам нужно сделать это для многих асинхронных функций, его можно обобщить следующим образом:

function asyncWrapper(innerFunction) {
   return (arg1, callback) {
     if (arg1 === SOME_VALUES) {
       callback(null, true);
     } else {
       innerFunction(arg1, callback);
     }
   }
}

так что вы можете назвать это как:

myAsyncWrapped = asyncWrapper(myAsync);
...