Как я могу избежать использования ключевого слова async везде? - PullRequest
0 голосов
/ 23 декабря 2019

Используя Javascript, рассмотрите следующую ситуацию:

  • Где-то Глубоко в стеке вызовов
  • Что-то становится Обещанием

Это может происходить по ряду причин.

// a calls b, calls c, and so on.

function z(){
    // Let's say this:
    // return 4;
    // Became this:
    return new Promise( (resolve, reject) => resolve(4) );
}

Функция Y больше не может использовать 4, поскольку она связана в обещании. К счастью, функция Y может await обещание, а затем продолжить работу в обычном режиме.

Однако, чтобы использовать await, функция Y должна использовать ключевое слово async, что приводит кY чтобы вернуть обещание.

Теперь функция X должна стать async до await Y, а функция W должна стать async до await X,И снова и снова, вплоть до резервного копирования дерева вызовов.

По сути, небольшое изменение, которое вводит обещание, может потребовать серьезного рефакторинга.

Есть ли способ избежать этого

Ответы [ 2 ]

0 голосов
/ 23 декабря 2019

Не рекомендую вам этот путь, но попробуйте что-то вроде ниже, возможно:

function Y(retVal) {
    if (retVal instanceof Promise){
        return (async function(){
            var result = await retVal;
            return  Y(result);
        }());
    } else {
        return retVal * 2;
    }
}

Y(4) //8;
Y(Promise.resolve(4))  //{<resolved>: 8}
0 голосов
/ 23 декабря 2019

Существует множество способов обработки обещаний, например, вы можете использовать async-await, .then (), поэтому, если какие-либо новые обещания приходят в глубокий стек вызовов, и у вас нет вариантов использовать async-await, используйте Promises. Метод .then ()

...