Autor Bluebird tutaj.
V8 obiecuje, że implementacja jest napisana w JavaScript, a nie C. Cały JavaScript (w tym własny V8) jest kompilowany do kodu natywnego. Dodatkowo JavaScript napisany przez użytkownika jest zoptymalizowany, jeśli to możliwe (i warto), przed skompilowaniem do kodu natywnego. Implementacja obietnic jest czymś, co nie przyniosłoby wiele korzyści lub wcale nie byłoby napisane w C, w rzeczywistości spowolniłoby to, ponieważ wszystko, co robisz, to manipulowanie obiektami JavaScript i komunikacją.
Implementacja V8 po prostu nie jest tak zoptymalizowana jak bluebird, na przykład alokuje tablice dla programów obsługi obietnic . Zajmuje to dużo pamięci, gdy każda obietnica musi również przydzielić kilka tablic (test porównawczy tworzy ogólnie 80 tys. Obietnic, więc przydzielono 160 tys. Nieużywanych tablic). W rzeczywistości 99,99% przypadków użycia nigdy nie rozgałęzia obietnicy więcej niż jeden raz, więc optymalizacja dla tego typowego przypadku zyskuje ogromne ulepszenia wykorzystania pamięci.
Nawet jeśli V8 zaimplementowałoby te same optymalizacje, co Bluebird, nadal byłoby to utrudnione przez specyfikację. Benchmark musi zostać wykorzystany new Promise
(anty-wzór w bluebird), ponieważ nie ma innego sposobu na stworzenie obietnicy root w ES6. new Promise
to niezwykle powolny sposób tworzenia obietnicy, najpierw funkcja executora przydziela zamknięcie, po drugie przekazuje 2 oddzielne zamknięcia jako argumenty. To 3 zamknięcia przydzielone na obietnicę, ale zamknięcie jest już droższym przedmiotem niż zoptymalizowana obietnica.
Można użyć Bluebird, promisify
który umożliwia wiele optymalizacji i jest znacznie wygodniejszym sposobem korzystania z interfejsów API wywołania zwrotnego oraz umożliwia konwersję całych modułów na moduły oparte na obietnicach w jednym wierszu ( promisifyAll(require('redis'));
).