2017-08-04 29 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 }; 
    } 
}