2017-08-01 65 views
2

假設我有函數使http調用並返回Observable與用戶的詳細信息。如何延遲發出錯誤的Observable

如果用戶不存在,則返回發出錯誤的Observable。

// Get user by id 
function getUser(id) { 
    return Rx.Observable.create(obs => { 
    if (id === 1) { 
     obs.next('200 - User found'); 
     obs.complete(); 
    } else { 
     obs.error('404 - User not found'); 
    } 
    }); 
} 

// This will print "200 - User found" in the console after 2 seconds 
getUser(1) 
    .delay(2000) 
    .subscribe(r => console.log(r)); 

// !!! Delay will not work here because error emmited 
getUser(2) 
    .delay(2000) 
    .subscribe(null, e => console.log(e)); 

有什麼辦法來延遲可觀察到發射錯誤

+0

你爲什麼推遲呢? –

+0

我想延遲對API的每個http請求,無論成功與否(測試應用程序在響應太長時如何表現) –

+1

您正在編寫測試嗎?你通常應該使用瀏覽器網絡選項卡節流功能來模擬長請求 –

回答

1

我很好奇,爲什麼可觀察到不延遲,如果返回錯誤

這裏是delay操作的源代碼:

class DelaySubscriber<T> extends Subscriber<T> { 
    ... 

    protected _next(value: T) { 
    this.scheduleNotification(Notification.createNext(value)); <-------- notification is scheduled 
    } 

    protected _error(err: any) { 
    this.errored = true; 
    this.queue = []; 
    this.destination.error(err); <-------- error is triggered immediately 
    } 

    protected _complete() { 
    this.scheduleNotification(Notification.createComplete()); 
    } 
} 

正如所有其他運營商, delay在您的案例中訂閱源流 - getUser() - 並通知聽衆。您可以從源代碼中看到它在發生錯誤時不會安排通知,並立即在observable上觸發error方法。

我不想耽誤每一個HTTP請求到API不管成功,或 不(測試應用程序將如何表現,如果響應過長)

我建議使用throttle能力的Chrome調試的工具(網絡選項卡)。