终于阻止了角度2的承诺

Dme*_*hro 16 javascript angular-promise angular

我观察到在角度2中,promise API没有finally块

角1:

 loadUsers() {
  fetch('/api/users').then((response) => {
    return response.json();
  }).then((data) => {
    this.users = data;
  }).catch((ex) => {
    console.error('Error fetching users', ex);
  }).finally(() => {
     this.userLoaded = true;
};
Run Code Online (Sandbox Code Playgroud)

假设我必须在角度2中做同样的事情

如何在角度2承诺中添加finally块,截至目前只有then & catch blocks角度2可用.如果不是最后那么在执行每个方法之后有没有办法添加清理代码,我在哪里编写代码来做最后的阻塞活动?

Tom*_*cer 15

最简单的方法是使用promise.finally shim.

  • 添加它 npm install --save promise.prototype.finally
  • 添加类型: npm install --save-dev @types/promise.prototype.finally
  • 在主类中,在引导应用程序之前,添加以下代码:
import { shim } from 'promise.prototype.finally';
shim();
Run Code Online (Sandbox Code Playgroud)

你现在应该可以使用finally你的承诺了.

  • @fiznool,谢谢你.有一点要补充,(我正在使用Angular4)我认为最好将垫片放在polyfills.ts文件中.我将以下内容放在该文件的底部`/****************************************************************************************************PROMISES.最终来自'promise.prototype.finally'的SHIM*/``import {shim as finallyShim}; finallyShim();` (2认同)

Kat*_*314 1

这通常是使用 Promise.always 完成的。这需要一个函数,并添加一个新的.then承诺,为成功和失败状态提供相同的函数。如果该函数在给定的基于 Promise 的环境中不可用,则很容易填充。

Promise.always = function(p, fn) {
  return p.then(fn, fn);
}
Run Code Online (Sandbox Code Playgroud)

用法:

var prom = fetch('/api/users').then...
Promise.always(prom, () => {
  this.userLoaded = true;
});
return prom;
Run Code Online (Sandbox Code Playgroud)