2017-05-24 67 views
6

Poszukuję sposobu, z Node v7.6 lub nowszym, aby otrzymać obietnicę Bluebird (lub inną nie-rodzimą obietnicę), gdy zostanie wywołana funkcja asynchroniczna.Otrzymaj obietnicę Bluebirda z async czekają funkcje

W ten sam sposób można zrobić:

global.Promise = require('Bluebird'); // Or Q/When 
var getResolvedPromise =() => Promise.resolve('value'); 

getResolvedPromise 
    .tap(...) // Bluebird method 
    .then(...); 

Patrz: May I use global.Promise=require("bluebird")

Chcę być w stanie zrobić coś takiego:

global.Promise = require('Bluebird'); // Or Q/When 
var getResolvedAsyncAwaitPromise = async() => 'value'; 

getResolvedAsyncAwaitPromise() 
    .tap(...) // Error ! Native Promises does not have `.tap(...)` 
    .then(...); 

Wiem, że mogę użyj w dowolnej chwili coś takiego:

Bluebird.resolve(getResolvedAsyncAwaitPromise()) 
    .tap(...); 

Ale byłem ciekawy, jeśli byłby sposób na zmianę domyślnej obietnicy zwróconej przez AsyncFunction. Konstruktor wydaje się być zamknięty:

Należy zauważyć, że AsyncFunction nie jest obiektem globalnym. Można go uzyskać, oceniając poniższy kod.

Object.getPrototypeOf(async function(){}).constructor 

MDN reference on AsyncFunction

Jeśli nie ma sposobu, aby zmienić Obietnica konstruktora AsyncFunction „s, chciałbym poznać przyczyny tego blokowania.

Dziękujemy!

+0

Nie, to nie jest możliwe. Gdyby tak było, oznaczałoby to, że na całym świecie nadpisałeś obietnicę, która jest koszmarem. – Bergi

Odpowiedz

8

Czy istnieje sposób, aby zmienić domyślną Obietnica zwrócony przez AsyncFunction

nr

Jakie są przyczyny tego blokujące

umiejętność porwania wszystko async function s może być problem bezpieczeństwa. Ponadto, nawet jeśli nie stanowi to problemu, nadal nie jest przydatna wymiana globalna. Wpłynie to na całą dziedzinę, w tym na wszystkie biblioteki, z których korzystasz. Mogą polegać na użyciu rodzimych obietnic. Nie można używać dwóch różnych bibliotek obietnic, chociaż mogą one być wymagane.

Chcę być w stanie zrobić coś takiego:

getResolvedAsyncAwaitPromise().tap(...) 

Co może wystarczy zawinąć funkcję w swojej definicji z Promise.method:

const Bluebird = require('Bluebird'); 
const getResolvedAsyncAwaitPromise = Bluebird.method(async() => 'value'); 

getResolvedAsyncAwaitPromise() 
.tap(…) // Works! 
.then(…);