Rxjs条件延迟

时间:2018-05-07 18:53:49

标签: rxjs5

我希望根据其值来延迟一个observable。例如:

class MainWindowController: NSWindowController {

    @IBOutlet weak var textField: NSTextField!
    @IBOutlet weak var speakButton: NSButton!
    @IBOutlet weak var stopButton: NSButton!

    let speechSynth = NSSpeechSynthesizer()

    override var windowNibName: NSNib.Name? {
        return NSNib.Name("MainWindowController")
    }

    override func windowDidLoad() {
        super.windowDidLoad()

    }

    // MARK: - Action methods
    @IBAction func speakIt(sender: NSButton) {

        //Get tuype-in text as a strin
        let string = textField.stringValue
        if string.isEmpty {
            print("string from \(textField) is empty")
        } else {
            speechSynth.startSpeaking(string)
        }
    }

    @IBAction func stopIt(sender: NSButton) {
        speechSynth.stopSpeaking()
    }
}

of(someBool).pipe(delay(1000)) 为假时跳过延迟,但等到它为真时等待。

2 个答案:

答案 0 :(得分:4)

您可以使用of(someBool).pipe( delayWhen(val => val ? interval(1000) : of(undefined)) )

empty()

旁注,根据使用of()代替openpyxl的文档,恕我直言会有效,但似乎没有。我相信这可能是一个错误。我有reported it

答案 1 :(得分:0)

对我来说,不清楚该问题的上下文。但我想举一个例子。假设您正在实现一个登录系统,并且想等到获得一些令牌以将其放入另一个Observable或Cookies中。然后,您可以等待Observable的值(someBool,但在我的情况下为this.authService.isLoggedIn)。因此,正如IngoBürk所说,您可以执行以下操作:

return this.authService.isLoggedIn
  .pipe(
    delayWhen(loggedIn => loggedIn ? interval(0) : interval(10000)),
  );

isLoggedIn的状态更改时,用户将登录。