dfilatov / vow

ES6-compatible and Promises/A+ implementation for Node.js and browsers
MIT License
344 stars 45 forks source link

Несовместимость с другими promises #88

Closed golyshevd closed 9 years ago

golyshevd commented 9 years ago

Привет!

У нас есть библиотека, API которой возвращает Bluebird промисы.

Странность была обнаружена в таком кейсе:

vow.all([Bluebird.reject(42)]).fail(function () { })

Этот код ломает внутри библиотеку, потому что defer.reject не вызывается в контексте defer.

Дело в том, что vow использует внутри себя свои особенности, например проброс контекста вызова коллбэков, но он не приводит промисы к своим инстансам. (cast). Cast работает неправильно из за неправильного метода isPromise который вобщем-то на самом деле isThenable.

Также очень странно работает из-за этого when

myMethod1: function () {
    return vow.when(someExtenralPromiseApi(), function () {
        // это не будет работать, потому что промис не был приведен к vow.Promise, this тут вероятнее всего будет undefined
        return this.method2();
    }, this);
},
method2: function () {}

Есть два лаконичных способа починить это, самый честный - это наверное починить isPromise чтобы он делал instanceof vow.Promise, или же сделать такую проверку в cast, но в любом случае пофейлятся тесты.

Мне кажется, второй способ менее разрушителен.

Есть идеи?

dfilatov commented 9 years ago

Я посмотрю подробнее на выходных что там

dfilatov commented 9 years ago

поправлено в 0.4.9