2017-05-24 45 views
6

Bluebird वादा (या कोई गैर-मूल वादा) प्राप्त करने के लिए, एसिंक फ़ंक्शन कहलाए जाने के लिए, मैं नोड v7.6 या ऊपर के साथ, एक रास्ता तलाश रहा हूं।एसिंक की प्रतीक्षा करने के लिए

उसी तरह मैं कर सकते हैं:

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

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

देखें: 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(...); 

मैं जानता हूँ कि मैं यह कर सकते हैं किसी भी पल में कुछ इस तरह उपयोग करें:

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

लेकिन उत्सुक था अगर AsyncFunction द्वारा लौटाए गए डिफ़ॉल्ट वादे को बदलने का कोई तरीका होगा। कन्स्ट्रक्टर संलग्न है:

ध्यान दें कि AsyncFunction वैश्विक वस्तु नहीं है। यह निम्नलिखित कोड का मूल्यांकन करके प्राप्त किया जा सकता है।

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

MDN reference on AsyncFunction

अगर वहाँ AsyncFunction की वादा निर्माता को बदलने के लिए कोई रास्ता नहीं है, मैं इस लॉकिंग के कारणों को पता करना चाहते हैं।

धन्यवाद!

+0

नहीं है, यह संभव नहीं है। यदि ऐसा होता, तो इसका मतलब यह होगा कि आप वैश्विक रूप से वादे कार्यान्वयन को ओवरराइट करेंगे, जो एक दुःस्वप्न है। – Bergi

उत्तर

8

वहाँ डिफ़ॉल्ट वादा AsyncFunction

द्वारा दिया

सं

क्या

सभी का अपहरण करने की क्षमता पर ताला लगा इस का कारण हैं बदलने के लिए एक रास्ता है async function एस एक सुरक्षा समस्या हो सकती है। साथ ही, यहां तक ​​कि जहां कोई समस्या नहीं है, फिर भी यह वैश्विक स्तर पर इस प्रतिस्थापन को करने में उपयोगी नहीं है। यह आपके पूरे क्षेत्र को प्रभावित करेगा, जिसमें आप उपयोग कर रहे सभी पुस्तकालयों सहित। वे देशी वादों का उपयोग करने पर भरोसा कर सकते हैं। और आप दो अलग-अलग वादे पुस्तकालयों का उपयोग नहीं कर सकते हैं, हालांकि उन्हें आवश्यकता हो सकती है।

मैं की तरह कुछ करने के लिए सक्षम होना चाहते हैं:

getResolvedAsyncAwaitPromise().tap(...) 

क्या आप कर सकते हैं कर Promise.method साथ अपनी परिभाषा पर समारोह रैप करने के लिए है:

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

getResolvedAsyncAwaitPromise() 
.tap(…) // Works! 
.then(…); 
संबंधित मुद्दे