Как обещают вести себя после обнаружения с помощью метода разрешения? [Дубликат]

Создать представление класса / объекта, только если то, что вы пытаетесь представить, может быть лучше объяснено как объект.

Хэш-карты - еще одно решение. Например, вместо разнородных массивов для возрастов и имен, если имена уникальны, вы можете использовать имя как ключи и возраст в качестве значения.

42
задан thefourtheye 6 March 2015 в 10:59
поделиться

2 ответа

JavaScript имеет концепцию «выполнить до завершения» . Если не возникает ошибка, функция выполняется до тех пор, пока не будет достигнут оператор return или его конец. Другой код вне функции не может помешать этому (кроме случаев, когда возникает ошибка).

Если вы хотите resolve() выйти из функции инициализации, вы должны добавить ее в return:

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});
77
ответ дан Bergi 15 August 2018 в 17:04
поделиться
  • 1
    Привет, Феликс. Я думаю, что это только часть истории - другая часть состоит в том, что resolve() сама является асинхронной. Как мы видели в другом (удаленном) ответе, некоторые люди считают, что вызов resolve немедленно запустит любые обратные вызовы. – Alnitak 6 March 2015 в 11:56
  • 2
    @Alnitak resolve сам по себе не является асинхронным, он полностью синхронный. Хотя использование строго ES6 API не наблюдается, является ли он синхронным или асинхронным. – Esailija 6 March 2015 в 12:25
  • 3
    @Esailija нормально, возможно, я был неясен. Некоторые люди считают, что вызов resolve приведет к тому, что любые зарегистрированные обратные вызовы будут немедленно вызваны так, чтобы они были частью текущего стека вызовов. Это неверно, вместо этого он просто ставит в очередь обратные вызовы (и вы правы, это не async, но он просто делает свое дело и немедленно прекращается) – Alnitak 6 March 2015 в 13:07
  • 4
    @Alnitak: Я понимаю, что вы говорите. Я просто интерпретировал его как почему вместо console.log появляется вместо этого, почему он появляется в этом порядке. До сих пор, что resolve делает и как обещания не имеют отношения к тому, как я интерпретирую этот вопрос. Но, конечно, все еще важно знать в контексте обещаний. Одна из причин, по которой я поддержал ваш ответ :) – Felix Kling 6 March 2015 в 17:28
  • 5
    @Bergi, в вашем редактировании, вы говорите «return resolve (); & quot; который кажется необычным. Для того, чтобы убедить себя, в этом нет ничего важного, мне пришлось прочитать документацию и увидеть, что (1) Решение (), похоже, не возвращает ничего из следствия, и (2) значение возвращаемого обратного вызова инициализации не как представляется, используются. Разве не было бы яснее сказать «разрешить (); возвращение; & Quot; тем самым избегая этого отвлечения? – Don Hatch 1 November 2016 в 08:33

Обратные вызовы, которые будут вызваны, когда вы resolve обещание по-прежнему требуется, чтобы спецификация была вызвана асинхронно. Это необходимо для обеспечения согласованного поведения при использовании обещаний для сочетания синхронных и асинхронных действий.

Поэтому, когда вы вызываете resolve, обратный вызов поставлен в очередь , а выполнение функции немедленно продолжается любой код, следующий за вызовом resolve().

Только после того, как цикл событий JS будет предоставлен обратно, можно удалить обратный вызов из очереди и фактически вызвать.

14
ответ дан Alnitak 15 August 2018 в 17:04
поделиться
  • 1
    Очередь обратного вызова документируется в спецификациях A + или в ES6? – thefourtheye 6 March 2015 в 11:13
  • 2
    @ thefourtheye: спецификация цикла событий фактически является частью HTML5 . ES6 определяет внутренний метод, называемый EnqueueJob , который вызывается .then . – Felix Kling 6 March 2015 в 11:18
  • 3
    @FelixKling О, спасибо :) – thefourtheye 6 March 2015 в 11:20
  • 4
    @thefourtheye: На самом деле ES6 также, похоже, определяет очереди: people.mozilla.org/~jorendorff/… . Я предполагаю, что связанный с циклом события так или иначе. – Felix Kling 6 March 2015 в 11:21
  • 5
    @FelixKling - это микротаски / макротовары, вот часть спецификации, которую «отбрасывают». «Когда нет исполняемого контекста выполнения, и стек контекста выполнения пуст, реализация ECMAScript удаляет первый PendingJob из очереди заданий и использует информацию, содержащуюся в нем, для создания контекста выполнения и запускает выполнение связанной операции. & Quot; – Benjamin Gruenbaum 6 March 2015 в 13:34
Другие вопросы по тегам:

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