Какая правильная терминология для javascript promises

Я запутался в разной терминологии. По моему мнению, обещание может быть:

fulfilled
rejected
pending 
settled
resolved
defer

Разрешено ли решение? или это означает, что оно выполнено? и что, черт возьми, откладывает?

Ответ 1

Терминология может быть сложной.
Возьмем из Promises/A + спецификацию и соответствующий раздел ES6, что существует 3 состояния:

  • ожидающий - обещание еще не приняло значение, оно еще не определено.
  • выполнено - обещание успешно получило значение результата "назначено"
  • отклонено. В обещании дается причина, по которой результат не может быть получен, как правило, ошибка.

Термин поселившийся является гиперонимом для выполненных и отклоненных, что означает либо противоположность ожидающего.

Динамические глаголы выполняют и отклонять описывают изменение состояния из ожидаемого или отложенного или отклоненного. Эти переходы называются выполнение или отклонение обещания.

Это было легко. Теперь разрешить - другой зверь. Иногда он используется как синоним "исполнять", но лучше понимать, как решить обетование судьбу либо исполненным, либо отвергнутым. разрешение (редко: урегулирование) обещания означает, что оно покидает состояние ожидания. Но даже это точно - проблема заключается в рекурсивном характере процедуры разрешения обещаний:

  • разрешение обещания с "равным" значением означает выполнение его
  • Решение обещания с обещанием (или последующим) означает принятие его состояния:

    • Решение с исполненным обещанием - это выполнение
    • Решение с отклоненным обещанием является отказом
    • Решение с ожидающим обещанием означает ожидание его разрешения

Да, если обещание будет разрешено, может даже не быть известно, будет ли оно выполнено или отклонено. Но это означает, что судьба больше не определена, поскольку она связана с обещанием, с которым мы разрешили (обратите внимание, что вы можете разрешить обещание только один раз).

Игнорируя этот частный случай, обещание разрешено обычно означает обещанное обещание.

Или, чтобы привести Спецификацию ECMAScript 6:

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


и что черт откладывает?

Отложить результат означает, что вы возвращаете (асинхронное) обещание для результата, а не результат напрямую (синхронно). А также вернуть отложенное отклонение вместо синхронного переключения.

Обратите внимание, что " отложить" также используется в некоторых библиотеках (Q) в качестве имени метода для постройте объект Deferred - см. этот ответ о различиях между отложенными, обещаниями и будущими для хорошего объяснения.
О, и никогда не доверяйте именам переменных: defer также может быть сокращенным "deferredObject".

Ответ 2

Три состояния обещания перечислены в разделе раздела 2.1 спецификации Promises/A +.

Из спецификации:

enter image description here

Итак, вот каждый из условий, о которых вы спрашивали:

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

Выполнено - это еще одно из трех состояний обещания. Это означает, что обещание было разрешено и теперь имеет свою разрешенную ценность. Операция, представленная обещанием, успешно завершена.

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

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

Решено - это термин, который часто используется для обозначения того же, что и fulfilled, но эти два не совсем одинаковы. Обещание может быть разрешено со значением, которое приводит к исполнению, или оно может быть разрешено с отклоненным обещанием (что приводит к отказу от этого обещания), или оно может быть разрешено с ожидающим обещанием (что означает, что он теперь будет ждать на конечном состояние какого-то другого обещания).

Трудно сказать, что вы подразумеваете под defer. Promises часто классифицируются как объекты deferred в том, что они представляют собой объект, который представляет действие и результат, отложенный до будущего (это произойдет в будущем). В некоторых реализациях Promises существуют два типа объектов: объект deferred и объект promise. Отложенный объект является надмножеством объекта обещания. Оба могут наблюдать, когда действие разрешено или отклонено с помощью обработчиков .then(). Но только объект deferred может фактически изменить состояние на resolved или rejected.

В jQuery вы можете создать отложенный объект с помощью $.Deferred(). В других реализациях, таких как ES6 promises, у вас есть только обеими объектами с обратным вызовом конструктора, который имеет функции reject и resolve. Похоже, что мир движется к тому, что будет у ES6.

Пример jQuery, который использует объект deferred:

function delay(t) {
    var defer = $.Deferred();
    setTimeout(function() {
        defer.resolve();
    }, t);
    return defer.promise()
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });

Пример обещания ES6:

 function delay(t) {
     return new Promise(function(resolve, reject) {
         setTimeout(function() {
             resolve();
         }, t);
     });
 }

 delay(200).then(function() {
     // run my delayed function now
     doMyThing();
 });

Ответ 3

Domenic Denicola " States and Fates" является хорошим, содержательным резюме.

Государства:

  • обещание выполняется, если promise.then(f) будет называть f "как можно скорее"
  • обещание отклоняется, если promise.then(undefined, r) будет называть r "как можно скорее"
  • обещание ожидается, если оно не будет выполнено и не отклонено.

Судьбы:

  • обещание разрешается, если попытка разрешить или отклонить его не имеет никакого эффекта, то есть обещание было "заблокировано", чтобы либо выполнить другое обещание, либо было выполнено или отклонено.
  • обещание не разрешено, если оно не разрешено, т.е. если попытка разрешить или отклонить его окажет влияние на обещание.

Следуйте ссылке для получения информации о связанных состояниях и судьбах.