New TypeScript async/await feature uses ES6 promises. AngularJS uses $q service promises with slightly different interface.
Is there any way to use TypeScript async/await feature with $q service promises?
New TypeScript async/await feature uses ES6 promises. AngularJS uses $q service promises with slightly different interface.
Is there any way to use TypeScript async/await feature with $q service promises?
You can make it work like this:
angular.module('your app')
.run(['$window', '$q', function($window, $q) {
$window.Promise = $q;
}]);
Promise. The statement about 'hackish' $window is false - it's there not because Angular is incapable of using native window, but because DI is good.async (TypeScript es2017 target) any way, because it relies on internal native implementation and not Promise global. See stackoverflow.com/a/45119519/3731501 for instance . A digest should be triggered after async function execution in more or less explicit manner.I do not think you will be able to use them directly. But it should be quite easy to convert q promise into a++ promise, something like this:
function Convert<T>(qPromise): Promise<T>
{
return new Promise<T>((resolve, reject) =>
{
qPromise.then((result: T) => resolve(result), (e) => reject(e));
});
};
$apply after each awaitFinally I used the following workaround:
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 for Typescript 1.8 generates __awaiter function in every file where await operator is used. I replace it with implementation which passes custom Promise constructor which initiates digest cycle after every resolve and reject call. Here is usage example: https://github.com/llRandom/ts-awaiter