2015-04-03 2 views
15

Я проверяя "Promises/A +" Спецификация, но не мог понять следующие вещи:Что касается обещаний/A + Спецификация, в чем разница между терминами «thenable» и «prom»?

В разделе 1. Терминология,

1.1. "promise” - объект или функция с тогдашним методом, поведение которого соответствует этой спецификации.

1.2. “thenable” - это объект или функция, которая определяет метод then.

Так в чем разница между условиями "thenable" и "promise"?

Также в разделе 2.3. Процедура разрешения обещаний,

Процедура разрешения обещаний - абстрактная операция, принимающая в качестве вклада обещание и значение, которое мы обозначаем как [[Resolve]](promise, x).

Так что мой вопрос:

Почему обозначаться в 2 открывающих и закрывающих скобок? Есть ли какое-нибудь соглашение?

Большое спасибо.

ответ

4

Это умная попытка упростить взаимодействие между различными библиотеками.

Спектр использует термин thenable всего в нескольких местах. Это одна является наиболее важным (empasis шахтным): процедура разрешения

Обещания это абстрактная операция принимает в качестве входных данных обещания и значение, которое мы обозначим, как [[Resolve]](promise, x). Если x - это возможный, он пытается дать обещание принять состояние x в предположении, что x ведет себя, по крайней мере, как обещание. В противном случае он выполняет обещание со значением x.

Это сделает реализаторы сделать чек как:

if (typeof(x.then) === 'function') { 
    // adopt the state of x 
} else { 
    // fulfill promise with value x 
} 

Если спецификации вместо указанного «если х есть обещание, то ...», как бы реализатор знать, является ли x является обещание или нет? Нет практического способа убедиться, что x соответствует спецификации Promise, просто проверив его.

реализатор (скажем, библиотека FooPromises может сделать что-то вроде

if (x instanceof FooPromises.Promise) { 
    // adopt the state of x 
} else { 
    // fulfill promise with value x 
} 

и было бы эффективно отклонять любые обещания, поступающие от различных реализаций.

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


Для вас вторым вопроса, я не уверен, но моя идея была бы, что обозначение [[Resolve]](promise, x) подчеркивает, что это абстрактная операция. Если они опустили скобки и только что сказали Resolve(promise, x), это как-то означало бы, что разработчики должны создать реальную функцию с именем Resolve и разоблачить ее.

Это не требуется - Resolve не является частью интерфейса promise; это лишь часть их поведения, которая была достаточно важна, чтобы получить имя и отдельный раздел в документах.

+0

Так в чем же разница между thenable и обещанием? как бы вы определили разницу? –

+0

Если я создаю объект 'var foo = {'then': function() {alert (123)}};', то это последующее, но явно не обещание. – Kos

+0

Благодарим вас за разъяснение. так что тогда есть какая-то функция «then», и обещание - это особый вид thenable, который соответствует спецификации, насколько я понимаю. –

14

В чем разница между терминами «thenable» и «prom»?

Я думаю, что раздел вы уже цитированной действительно ответить на этот вопрос очень хорошо:

  • thenable является объектом с помощью метода then. Любой объект.
  • Обещание - это объект с методом then (т. Е. Подходящий) , который соответствует спецификации.

До сих пор так просто. Я думаю, что ваш фактический вопрос: «Почему они отличаются?«

Проблема в том, что, глядя на объект, вы не можете решить, является ли это обещанием.
может быть в состоянии сказать, что это обещание, потому что вы можете видеть, что его метод then реализован вами или кем-то, кому вы доверяете, - библиотека обещаний по вашему выбору. Вы могли бы «видеть» это, потому что объект наследует от вашего прототипа обещания, или вы даже можете сравнить метод, который (по сути) идентичен функции, которую вы определили. Или любой другой метод проверки, достаточный для вас.
может быть в состоянии сказать, что это не обещание, потому что оно не имеет метода then.
Но что вы делаете с объектом, который реализует then, но не известно, что это обещание? Это thenable и будет обрабатываться как таковой.

Спецификация Promises/A + предназначена для взаимодействия между реализациями обещаний и использует метод .then() для duck typing. Он задает точный алгоритм о том, как обрабатывать такие thenables (что может обещать или хотя бы иметь подобное поведение), чтобы вы могли создать реальное, надежное («известное») обещание от них.

Почему это обозначено в 2 открытых и закрывающих скобках? Есть ли какое-нибудь соглашение?

Да, спецификация ECMAScript использовать этот синтаксис для internal methods and properties:

Имен внутренних свойств заключены в двойных квадратных скобках [[]].

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

+1

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

+0

Я не нашел в спецификациях Promise A +, какие требования к методу then then then then. Если это обязательно, чтобы вернуть обещание от него и т. Д., Это немного неясно. –

+0

@ MikaelLepistö Спецификация Promises/A + не предполагает * ничего * о thenables (их методы 'then' вызывают с двумя обратными вызовами и, как минимум, будут вызывать хотя бы один из них по крайней мере один раз), он только устанавливает требования для' затем 'метод обещаний. – Bergi

 Смежные вопросы

  • Нет связанных вопросов^_^