почему setTimeout в асинхронной функции нужно снова переносить в новый Pormise? [Дубликат]

Как Padraic Cunningham выяснил , это на самом деле не ошибка.

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


недавнее изменение (где-то между 3.4.1 и 3.4.3 и между 2.7.3 и 2.7.8), которое влияет на это. Перед этим изменением вы не сможете даже скомпилировать этот шаблон без повышения OverflowError.

Что еще более важно, почему вы используете re.L? Механизм re.L не означает «использовать правила Юникода для моей локали», это означает «использовать некоторые неуказанные правила, отличные от Юникода, которые действительно имеют смысл только для латинских производных локалей и могут работать неправильно на Windows». Или, как , docs положил его:

Задает \w, \W, \b, \B, \s и \S зависимые по текущему языку. Использование этого флага не рекомендуется, так как языковой механизм очень ненадежный и он обрабатывает только одну «культуру» в любой момент; вместо этого вы должны использовать Unicode-сопоставление, которое по умолчанию используется в шаблонах Python 3 для Unicode (str).

blockquote>

См. bug # 22407 и связанный поток python-dev для недавнего обсуждения этого вопроса.

И если я удалю флаг re.L, теперь код теперь компилируется просто отлично на 3.4.1. (Я также получаю «правильные» результаты как на 3.4.1, так и на 3.4.3, но это просто совпадение: теперь я намеренно не передаю винтовой флаг и ввинчиваю его в первую версию и все равно случайно не передаю винтовой флаг и завинчивание его во втором, так что они совпадают ...)

Итак, даже если это была ошибка, есть хороший шанс, что он будет закрыт WONTFIX. Разрешение для # 22407 состояло в том, чтобы осудить re.L для шаблонов не bytes в 3.5 и удалить его в 3.6, поэтому я сомневаюсь, что кто-то позаботится об исправлении ошибок с ним сейчас. (Не говоря уже о том, что сам re теоретически уходит в пользу regex в течение одного из этих десятилетий ... и IIRC regex также не одобрял флаг L, если вы не используете bytes и re -совместимый режим.)

1
задан azulay7 16 January 2019 в 09:37
поделиться

1 ответ

async просто сахар для возврата обещания. Поэтому, когда вы говорите

async sleep_not_Working()
{
   setTimeout( ()=> {
        return "hello";
    }, 3000);
}

Это в основном то же самое, что и это:

function sleep_not_Working()
{
    return new Promise((resolve, reject) => {
        setTimeout( ()=> {
            return "hello";
        }, 3000);
    })       
}

Но это не так, как работают обещания. Возврат из внутренней анонимной функции не разрешает обещание, единственное, что разрешает обещание, это resolve('hello')

0
ответ дан TKoL 16 January 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: