2016-02-25 14 views
16

नई टाइपस्क्रिप्ट async/प्रतीक्षा सुविधा ES6 वादों का उपयोग करता है। AngularJS $q सेवा का उपयोग थोड़ा अलग इंटरफ़ेस के साथ करता है।

क्या $q सेवा वादे के साथ टाइपस्क्रिप्ट एसिंक/प्रतीक्षा सुविधा का उपयोग करने का कोई तरीका है?

+1

हां। पहली समस्या यह है कि मुझे एनजी-सेवा से हर वादे-प्रतिक्रिया को इसके खिलाफ इंतजार करने के लिए परिवर्तित करना होगा। दूसरी समस्या यह है कि प्रतीक्षा अभिव्यक्ति द्वारा उत्पन्न ईएस 6-वादे कोणीय पाचन चक्र शुरू नहीं करते हैं – Random

उत्तर

16

यहाँ कि यह कैसे हुआ है:: यहाँ के उपयोग का उदाहरण है

angular.module('your app') 
     .run(['$window', '$q', function($window, $q) { 
      $window.Promise = $q; 
     }]); 
+0

धन्यवाद, यह मेरे संस्करण से कहीं अधिक साफ है। मुझे नहीं पता था कि $ 6 सेवा का इस्तेमाल ईएस 6-वादे – Random

+1

के साथ संगत कन्स्ट्रक्टर के रूप में किया जा सकता है, यह काम करता है, और अब मैं इसे कई परियोजनाओं में उपयोग कर रहा हूं। लेकिन मैं मदद नहीं कर सकता लेकिन यह महसूस कर रहा हूं कि यह शरारती है। कोणीय $ q सेवा के साथ वैश्विक वादा ऑब्जेक्ट को प्रतिस्थापित करना लगता है ... हैकिश। –

+2

$ q के साथ देशी वादा को प्रतिस्थापित करना शायद सबसे खराब चीज है जिसे कोई भी एप्लिकेशन के साथ कर सकता है। वे मौलिक रूप से अलग-अलग कार्यान्वयन हैं जो अलग-अलग व्यवहार करते हैं, यह सभी तृतीय-पक्ष कोड को बर्बाद कर देगा जो 'वादा' पर निर्भर करता है। 'हैकिश' $ विंडो के बारे में बयान गलत है - ऐसा इसलिए नहीं है क्योंकि कोणीय मूल विंडो का उपयोग करने में असमर्थ है, लेकिन क्योंकि DI अच्छा है। – estus

3

मुझे नहीं लगता कि आप उन्हें सीधे उपयोग करने में सक्षम होंगे। लेकिन वह इस तरह का ++ वादा में क्ष वादा कन्वर्ट करने के लिए, कुछ काफी आसान होना चाहिए: हर फ़ाइल जहां में __awaiter समारोह उत्पन्न करता टाइपप्रति 1.8 के लिए

declare var __awaiter: Function; 
(window as any).__awaiter = __awaiter; // set global __awaiter to avoid declaring default __awaiter in other files 
async() => { } // dummy async function to generate __awaiter code for current file 

angular.module('ts-awaiter', []).run(['$timeout', ($timeout: ng.ITimeoutService) => { 
    function wrap(func: Function) { 
     return function() { 
      func.apply(this, arguments); 
      $timeout(() => { }); // run angular digest 
     }; 
    } 

    var oldAwaiter = __awaiter; 
    (window as any).__awaiter = (thisArg: any, _arguments: any, P: Function, generator: any) => { 
     P = function (executor: Function) { 
      return new Promise<any>((resolve, reject) => { 
       resolve = wrap(resolve); 
       reject = wrap(reject); 
       executor(resolve, reject); 
      }); 
     }; 
     return oldAwaiter(thisArg, _arguments, P, generator); 
    }; 
}]); 

Comliper:

function Convert<T>(qPromise): Promise<T> 
{ 
    return new Promise<T>((resolve, reject) => 
    { 
     qPromise.then((result: T) => resolve(result), (e) => reject(e)); 
    }); 
}; 
+4

समस्या यह है कि इस मामले में मुझे प्रत्येक एनजी सेवा को लपेटना होगा जो $ q वादे देता है। इसके अलावा, ईएस 6-वादे कोणीय पाचन चक्र शुरू नहीं करते हैं। इसलिए, इस मामले में मुझे प्रत्येक 'प्रतीक्षा' – Random

1

अंत में मैं निम्नलिखित तरीके को इस्तेमाल किया await ऑपरेटर का उपयोग किया जाता है। मैं इसे कार्यान्वयन के साथ प्रतिस्थापित करता हूं जो कस्टम Promise कन्स्ट्रक्टर पास करता है जो प्रत्येक resolve और reject कॉल के बाद पाचन चक्र शुरू करता है। https://github.com/llRandom/ts-awaiter

+0

के बाद '$ आवेदन' पर कॉल करना होगा, जिज्ञासा से बाहर यह संभाल कैसे अस्वीकार करता है? पकड़ ब्लॉक? – Luis

+0

हां। भंडार – Random

+0

में एक उदाहरण जोड़ा गया है जिसके परिणामस्वरूप अनियंत्रित digests, और digular AngularJS ऐप प्रदर्शन के लिए सबसे आम बाधा है। और समाधान टाइपस्क्रिप्ट ES2017 लक्ष्य पर लागू नहीं है ... मूल async/प्रतीक्षा पहले से ही है। – estus

संबंधित मुद्दे