写清洁承诺完成关闭

时间:2017-08-04 18:03:12

标签: angular promise subscribe

Angular和Promises的新手,但我意识到我已经做了很多这样的事情:

ListView

如何为我的订阅方法重写完成闭包,以便我不重复这样的代码?谢谢!

3 个答案:

答案 0 :(得分:2)

一种方法是将回调提取到泛型函数中,然后传递它们:

const successHandler = (data: any) => resolve({success: true, data });
const errorHandler = (message) => resolve({success: false, message });

this.myService.createFoo(data).subscribe(successHandler, errorHandler);
this.myService.updateFoo(data).subscribe(successHandler, errorHandler);

如果你想在Promise的范围之外定义这些(我假设你发布的代码在里面),你可以讨好处理程序:

<强>一些-util的-library.js

const handlers = resolve => ({
    success: (data: any) => resolve({success: true, data }),
    error: (message) => resolve({success: false, message })
});
export { handlers };

<强> otherfile.js

import { handlers } from './some-util-library.js';
... other code
const { success, error } = handlers(resolve);
this.myService.createFoo(data).subscribe(success, error);
this.myService.updateFoo(data).subscribe(success, error);

答案 1 :(得分:0)

我假设你正在尝试返回一个承诺,并且你发布的代码包含在一个看起来像这样的方法中:

create(): Promise<any> {
  const data = 'whatever';
  return new Promise<any>((resolve, reject) => {
    this.myService.createFoo(data).subscribe(
      (result: any) => {
        resolve({ success: true, data: result });
      },
      err => {
        resolve({ success: false, message: err });
      });
  });
}

如果是这种情况,您可以使用toPromise运算符将Observable转换为承诺,而不是手动创建承诺。如果您还没有,则需要先导入它:

import 'rxjs/add/operator/toPromise';

然后,将其与asyncawait相结合,您可以按如下方式转换代码:

async create(): Promise<any> {
  const data = 'whatever';
  try {
    const result = await this.myService.createFoo(data).toPromise();
    return { success: true, data: result }
  } catch (err) {
    return { success: false, message: err };
  }
}

答案 2 :(得分:0)

这似乎是Angular HttpClient Interceptors

的完美用例