2017-08-04 54 views
3

新建角和承诺,但我已经意识到我已经这样做了很多:编写清洁无极完成关闭

this.myService.createFoo(data).subscribe(
    (result: any) => { 
    resolve({success: true, data: result}); 
    }, 
    err => { 
    resolve({success: false, message: err}); 
    }); 

this.myService.updateFoo(data).subscribe(
    (result: any) => { 
    resolve({success: true, data: result}); 
    }, 
    err => { 
    resolve({success: false, message: err}); 
    }); 

我将如何改写完成关闭我的订阅方法,让我不像这样重复的代码?谢谢!

+0

您可以尝试使用'async'和'await',但我不确定这将会是多么容易滑入你正在做的事情(不是非常熟悉角度或订阅)https:// developer.mozilla.org/en-US/docs/Web/JavaScript/Re ference/Statements/async_function –

+1

如何定义“resolve”和“reject”?那些来自'Promise'构造函数的东西,比如'return new Promise((resolve,reject)=> {...})'还是别的地方?如果您发布了一个稍微更具包容性的代码示例,可能会有帮助 –

+0

是的,就像你说的那样,正常的“新承诺......”。 – 7ball

回答

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); 
+0

你可以像这样使用'resolve',或者你必须指定它作为参数吗? – Matthew

+0

好的问题是,在代码OP中发布'resolve'来自何处并不明显,所以我认为它可以从父范围或作为全局 –

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 }; 
    } 
}