नई टाइपस्क्रिप्ट async/प्रतीक्षा सुविधा ES6 वादों का उपयोग करता है। AngularJS $q
सेवा का उपयोग थोड़ा अलग इंटरफ़ेस के साथ करता है।
क्या $q
सेवा वादे के साथ टाइपस्क्रिप्ट एसिंक/प्रतीक्षा सुविधा का उपयोग करने का कोई तरीका है?
नई टाइपस्क्रिप्ट async/प्रतीक्षा सुविधा ES6 वादों का उपयोग करता है। AngularJS $q
सेवा का उपयोग थोड़ा अलग इंटरफ़ेस के साथ करता है।
क्या $q
सेवा वादे के साथ टाइपस्क्रिप्ट एसिंक/प्रतीक्षा सुविधा का उपयोग करने का कोई तरीका है?
यहाँ कि यह कैसे हुआ है:: यहाँ के उपयोग का उदाहरण है
angular.module('your app')
.run(['$window', '$q', function($window, $q) {
$window.Promise = $q;
}]);
धन्यवाद, यह मेरे संस्करण से कहीं अधिक साफ है। मुझे नहीं पता था कि $ 6 सेवा का इस्तेमाल ईएस 6-वादे – Random
के साथ संगत कन्स्ट्रक्टर के रूप में किया जा सकता है, यह काम करता है, और अब मैं इसे कई परियोजनाओं में उपयोग कर रहा हूं। लेकिन मैं मदद नहीं कर सकता लेकिन यह महसूस कर रहा हूं कि यह शरारती है। कोणीय $ q सेवा के साथ वैश्विक वादा ऑब्जेक्ट को प्रतिस्थापित करना लगता है ... हैकिश। –
$ q के साथ देशी वादा को प्रतिस्थापित करना शायद सबसे खराब चीज है जिसे कोई भी एप्लिकेशन के साथ कर सकता है। वे मौलिक रूप से अलग-अलग कार्यान्वयन हैं जो अलग-अलग व्यवहार करते हैं, यह सभी तृतीय-पक्ष कोड को बर्बाद कर देगा जो 'वादा' पर निर्भर करता है। 'हैकिश' $ विंडो के बारे में बयान गलत है - ऐसा इसलिए नहीं है क्योंकि कोणीय मूल विंडो का उपयोग करने में असमर्थ है, लेकिन क्योंकि DI अच्छा है। – estus
मुझे नहीं लगता कि आप उन्हें सीधे उपयोग करने में सक्षम होंगे। लेकिन वह इस तरह का ++ वादा में क्ष वादा कन्वर्ट करने के लिए, कुछ काफी आसान होना चाहिए: हर फ़ाइल जहां में __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));
});
};
समस्या यह है कि इस मामले में मुझे प्रत्येक एनजी सेवा को लपेटना होगा जो $ q वादे देता है। इसके अलावा, ईएस 6-वादे कोणीय पाचन चक्र शुरू नहीं करते हैं। इसलिए, इस मामले में मुझे प्रत्येक 'प्रतीक्षा' – Random
अंत में मैं निम्नलिखित तरीके को इस्तेमाल किया await
ऑपरेटर का उपयोग किया जाता है। मैं इसे कार्यान्वयन के साथ प्रतिस्थापित करता हूं जो कस्टम Promise
कन्स्ट्रक्टर पास करता है जो प्रत्येक resolve
और reject
कॉल के बाद पाचन चक्र शुरू करता है। https://github.com/llRandom/ts-awaiter
के बाद '$ आवेदन' पर कॉल करना होगा, जिज्ञासा से बाहर यह संभाल कैसे अस्वीकार करता है? पकड़ ब्लॉक? – Luis
हां। भंडार – Random
में एक उदाहरण जोड़ा गया है जिसके परिणामस्वरूप अनियंत्रित digests, और digular AngularJS ऐप प्रदर्शन के लिए सबसे आम बाधा है। और समाधान टाइपस्क्रिप्ट ES2017 लक्ष्य पर लागू नहीं है ... मूल async/प्रतीक्षा पहले से ही है। – estus
हां। पहली समस्या यह है कि मुझे एनजी-सेवा से हर वादे-प्रतिक्रिया को इसके खिलाफ इंतजार करने के लिए परिवर्तित करना होगा। दूसरी समस्या यह है कि प्रतीक्षा अभिव्यक्ति द्वारा उत्पन्न ईएस 6-वादे कोणीय पाचन चक्र शुरू नहीं करते हैं – Random