javascript - async - await angular 7
Mecanografíe el servicio async/await y angular $ q (3)
Finalmente utilicé la siguiente solución:
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 para Typescript 1.8 genera la función __awaiter
en cada archivo donde se usa el operador de await
. Lo sustituyo por la implementación que pasa el constructor de Promise
personalizado que inicia el ciclo de resumen después de cada resolve
y reject
llamada. Aquí está el ejemplo de uso: https://github.com/llRandom/ts-awaiter
La nueva característica de TypeScript async / await utiliza promesas de ES6. AngularJS usa promesas de servicio de $q
con una interfaz ligeramente diferente.
¿Hay alguna forma de usar la característica asíncrona / espera de TypeScript con las promesas de servicio de $q
?
No creo que puedas usarlos directamente. Pero debería ser bastante fácil convertir la promesa q en una promesa ++, algo como esto:
function Convert<T>(qPromise): Promise<T>
{
return new Promise<T>((resolve, reject) =>
{
qPromise.then((result: T) => resolve(result), (e) => reject(e));
});
};
Puedes hacerlo funcionar así:
angular.module(''your app'')
.run([''$window'', ''$q'', function($window, $q) {
$window.Promise = $q;
}]);