2017-05-24 15 views
6

Bir async işlevi çağrıldığında, Bluebird Promise (veya herhangi bir yerel olmayan söz) almak için Node v7.6 veya üstü ile bir yol arıyorum.Async işlevlerinden Bluebird Promise alın

Aynı şekilde yapabileceğim:

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

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

Bkz: Ben böyle bir şey yapmak mümkün istiyorum May I use global.Promise=require("bluebird")

:

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

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

bundan emin oluyorum herhangi bir anda aşağıdaki gibi kullanın:

tarafından döndürülen varsayılan Promise değiştirmek için bir yol olurdu
Bluebird.resolve(getResolvedAsyncAwaitPromise()) 
    .tap(...); 

10 Ama meraklı oldu. Yapıcı kapalı görünüyor: AsyncFunction küresel nesne değil

Not. Aşağıdaki kodu değerlendirerek elde edilebilir.

AsyncFunction 'ın Promise yapıcı değiştirmek için hiçbir yolu varsa

MDN reference on AsyncFunction

Object.getPrototypeOf(async function(){}).constructor 
, bu kilitleme nedenlerini bilmek istiyorum.

Teşekkür ederiz!

+0

Hayır, Bu mümkün değil. Eğer öyleyse, bu, küresel bir şekilde, bir kabus olan vaat uygulamasının üzerine yazacağınız anlamına gelir. – Bergi

cevap

8

tüm kaçırmak yeteneği kilitleme bunun nedenleri nelerdir AsyncFunction

tarafından döndürülen varsayılan Promise

sayılı

değiştirmek için bir yolu var mı async function s bir güvenlik sorunu olabilir. Ayrıca, bunun sorun olmadığı durumlarda bile, bu değişimi global olarak yapmak hala işe yaramıyor. Kullandığınız tüm kütüphaneler de dahil olmak üzere tüm alanınızı etkileyecektir. Yerel sözleri kullanmaya güvenebilirler. Ve gerekli olabilecekleri halde iki farklı söz kütüphanesi kullanamazsınız.

ben böyle bir şey yapmak mümkün istiyorum:

getResolvedAsyncAwaitPromise().tap(...) 

Ne can yapmak Promise.method ile tanımlamadaki işlevini sarılmasıdır:

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

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