第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Mono.defer() 做什么?

Mono.defer() 做什么?

嚕嚕噠 2022-11-02 17:29:57
我在一些 Spring webflux 代碼中遇到過(guò) Mono.defer()我在文檔中查找了該方法,但不理解解釋?zhuān)骸皠?chuàng)建一個(gè) Mono 提供程序,它將為下游的每個(gè)訂閱者提供一個(gè)要訂閱的目標(biāo) Mono”請(qǐng)給我一個(gè)解釋和一個(gè)例子。有沒(méi)有我可以參考的一堆 Reactor 示例代碼(他們的單元測(cè)試?)。謝謝
查看完整描述

4 回答

?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊

這有點(diǎn)過(guò)于簡(jiǎn)單化了,但從概念上講,Reactor 源要么是懶惰的,要么是急切的。更高級(jí)的請(qǐng)求,如 HTTP 請(qǐng)求,預(yù)計(jì)會(huì)被延遲評(píng)估。另一方面,最簡(jiǎn)單的人喜歡Mono.just或Flux.fromIterable渴望。


我的意思是調(diào)用Mono.just(System.currentTimeMillis())將立即調(diào)用該currentTimeMillis()方法并捕獲結(jié)果。所述結(jié)果僅由訂閱后發(fā)出。Mono多次訂閱也不會(huì)改變值:


Mono<Long> clock = Mono.just(System.currentTimeMillis());

//time == t0


Thread.sleep(10_000);

//time == t10

clock.block(); //we use block for demonstration purposes, returns t0


Thread.sleep(7_000);

//time == t17

clock.block(); //we re-subscribe to clock, still returns t0

運(yùn)營(yíng)商在那里讓這個(gè)源變得懶惰,每次有新訂閱者時(shí)defer重新評(píng)估 lambda 的內(nèi)容:


Mono<Long> clock = Mono.defer(() -> Mono.just(System.currentTimeMillis()));

//time == t0


Thread.sleep(10_000);

//time == t10

clock.block(); //invoked currentTimeMillis() here and returns t10


Thread.sleep(7_000);

//time == t17

clock.block(); //invoke currentTimeMillis() once again here and returns t17


查看完整回答
反對(duì) 回復(fù) 2022-11-02
?
慕容森

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊

如果您在第一個(gè)視圖中看到簡(jiǎn)單的話 ,它就像 Mono.just() 但不是。當(dāng)您運(yùn)行 Mono.just() 時(shí),它會(huì)立即創(chuàng)建一個(gè) Observable(Mono) 并重用它,但是當(dāng)您使用 defer 時(shí),它不會(huì)立即創(chuàng)建它,它會(huì)在每個(gè)訂閱中創(chuàng)建一個(gè)新的 Observable。


一個(gè)用例看差異


    int a = 5;

@Override

public void run(String... args) throws Exception {


    Mono<Integer> monoJust = Mono.just(a);

    Mono<Integer> monoDefer = Mono.defer(() -> Mono.just(a));


    monoJust.subscribe(integer1 -> System.out.println(integer1));

    monoDefer.subscribe(integer1 -> System.out.println(integer1));


    a = 7;

    monoJust.subscribe(integer1 -> System.out.println(integer1));

    monoDefer.subscribe(integer1 -> System.out.println(integer1));

}

打?。?/p>


5

5

5

7

如果您看到 mono.just 立即創(chuàng)建了 observable 并且即使值已更改它也不會(huì)更改,但是 defer 在 subscribe 中創(chuàng)建 observable 所以您將使用當(dāng)前的 onSubscribe 值


查看完整回答
反對(duì) 回復(fù) 2022-11-02
?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊

我正在嘗試defer不同的用例。編寫(xiě)以下代碼來(lái)檢查和共享,因?yàn)樗赡軐?duì)其他人有所幫助。我的用例是鏈接兩個(gè)Monos 并確保第一個(gè)在第二個(gè)被占用之前完成。第二個(gè)包含一個(gè)阻塞調(diào)用,其結(jié)果用于響應(yīng)Monowithempty或errorresponse。沒(méi)有defer,無(wú)論第一個(gè)結(jié)果如何,都會(huì)執(zhí)行我的阻塞調(diào)用。但是在使用defer阻塞調(diào)用時(shí),只有在第一個(gè)Mono完成時(shí)才會(huì)執(zhí)行。下面的代碼:


public static void main(String[] args) {

    long cur = System.currentTimeMillis();

    boolean succeed = true;


    Mono<Integer> monoJust = Mono.create(consumer -> {

        System.out.println("MonoJust inside " + (System.currentTimeMillis() - cur));

        if (succeed) {

            consumer.success(1);

        } else {

            consumer.error(new RuntimeException("aaa"));

        }

    });


    Mono<String> monoJustStr = Mono.create(consumer -> {

        System.out.println("MonoJustStr inside: " + (System.currentTimeMillis() - cur));

        consumer.success("one");

    });


    System.out.println("##1##: Begin");

    monoJust.then(evaluator() ? Mono.empty() : monoJustStr).subscribe(d -> System.out.println("##1##: "+d), e-> System.err.println(e));

    System.out.println("##1##: Done: "+(System.currentTimeMillis() - cur));


    System.out.println("\n\n\n##2##: Begin");

    monoJust.then(Mono.defer(() -> evaluator() ? Mono.empty() : monoJustStr)).subscribe(d -> System.out.println("##2##: "+d), e-> System.err.println(e));

    System.out.println("##2##: Done: " + (System.currentTimeMillis() - cur));


}


private static boolean evaluator() {

    System.out.println("Inside Evaluator");

    return false;

}

輸出succeed=true- 觀察“Inside Evaluator”和“MonoJust inside”的順序


##1##: Begin

Inside Evaluator

MonoJust inside 540

MonoJustStr inside: 542

##1##: one

##1##: Done: 542




##2##: Begin

MonoJust inside 544

Inside Evaluator

MonoJustStr inside: 544

##2##: one

##2##: Done: 544

下面是輸出succeed = false- 注意沒(méi)有調(diào)用評(píng)估器。


##1##: Begin

Inside Evaluator

MonoJust inside 565

java.lang.RuntimeException: aaa

##1##: Done: 567




##2##: Begin

MonoJust inside 569

java.lang.RuntimeException: aaa

##2##: Done: 569


查看完整回答
反對(duì) 回復(fù) 2022-11-02
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

初學(xué)者的簡(jiǎn)單答案:


當(dāng)在 monoJust 變量上調(diào)用 subscribe 時(shí),它將打印一個(gè)隨機(jī)整數(shù)三次。但是在對(duì) monoDefer 變量調(diào)用 subscribe 時(shí),它每次都可以打印一個(gè)隨機(jī)數(shù)。


   Mono<Integer> justMono = Mono.just((new Random()).nextInt(10));


    //this will print same random number thrice

    for(int i=0;i<3;i++)

        justMono.subscribe(x -> {System.out.println("Just Mono: " + x);});


    Mono<Integer> deferMono = Mono.defer(() -> Mono.just((new Random()).nextInt(10)));


    //this might print three different random numbers

    for(int i=0;i<3;i++)

        deferMono.subscribe(x -> {System.out.println("Defer Mono: " + x);});

在 Mono.just() 中,實(shí)例化僅在第一次訂閱發(fā)生時(shí)發(fā)生一次。在 Mono.defer() 中,每次調(diào)用訂閱時(shí)都會(huì)發(fā)生實(shí)例化。


如需更多參考,請(qǐng)查看: https ://www.youtube.com/watch?v=eupNfdKMFL4&t= 381s at 3:15 mins


查看完整回答
反對(duì) 回復(fù) 2022-11-02
  • 4 回答
  • 0 關(guān)注
  • 622 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)