Это умная попытка упростить взаимодействие между различными библиотеками.
Спектр использует термин 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; это лишь часть их поведения, которая была достаточно важна, чтобы получить имя и отдельный раздел в документах.
Так в чем же разница между thenable и обещанием? как бы вы определили разницу? –
Если я создаю объект 'var foo = {'then': function() {alert (123)}};', то это последующее, но явно не обещание. – Kos
Благодарим вас за разъяснение. так что тогда есть какая-то функция «then», и обещание - это особый вид thenable, который соответствует спецификации, насколько я понимаю. –