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

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

如何模仿 Jest 描述模式?

如何模仿 Jest 描述模式?

開滿天機(jī) 2023-07-14 15:43:29
如何在 javascript 中編寫login和get函數(shù)?我有一種感覺,通過一些內(nèi)聯(lián)函數(shù)、bind 和這個(gè)魔法的混合是可能的。或者說這是不可能的?Promise.all([  login("user1", () => {    console.log(get("/healthy")); // prints "user1/healthy"  }),  login("user2", () => {    console.log(get("/ready")); // prints "user2/ready"  })]);我知道可以這樣寫。但我很好奇在沒有 obj 的情況下編寫它。login("user1", (obj) => {  obj.get("/ready");});這不是類似于 Jest 編碼描述/它模式的方式嗎?describe("Login test", () => {  test("Login", async () => {    expect("ready").toEqual("ready");  });});
查看完整描述

1 回答

?
MYYA

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

所以你可以從技術(shù)上讓它工作,但我不推薦,原因我稍后會(huì)解釋。


get這是一個(gè)將函數(shù)作為局部變量的工作示例。get我們在調(diào)用回調(diào)之前立即分配給該變量。

它將登錄上下文保存在其閉包范圍內(nèi)。因?yàn)?JavaScript 是單線程的,我們知道在回調(diào)運(yùn)行之前不能再次重新分配變量。


在這里您可以看到它使用隨機(jī)超時(shí)來模擬 http 調(diào)用。即使用戶和 url 以隨機(jī)順序異步執(zhí)行,它們也會(huì)正確配對。(嘗試多次運(yùn)行此代碼片段以檢查輸出是否始終一致。)


const sleep = () =>

  new Promise((resolve) => setTimeout(resolve, Math.random() * 1000));


let get;


async function login(username, callback) {

  console.log("logging in as", username);

  await sleep();

  get = async(url) => {

    await sleep();

    return `/${username}${url}`;

  };

  callback();

}


Promise.all([

  login("Alice", async() => {

    console.log(await get("/Active"));

  }),

  login("Bob", async() => {

    console.log(await get("/Build"));

  }),

  login("Colin", async() => {

    console.log(await get("/Compile"));

  }),

]);

我不推薦的原因是因?yàn)檫@是非常脆弱的代碼。我們必須非常小心,以確保get僅在回調(diào)開始時(shí)調(diào)用該函數(shù)。


例如,如果我們跟注sleepthen get,那么所有的賭注都會(huì)被取消。我們不知道get正在使用哪個(gè)上下文。


const sleep = () =>

  new Promise((resolve) => setTimeout(resolve, Math.random() * 1000));


let get;


async function login(username, callback) {

  console.log("logging in as", username);

  await sleep();

  get = async(url) => {

    await sleep();

    return `/${username}${url}`;

  };

  callback();

}


Promise.all([

  login("Alice", async() => {

    await sleep();   // <-- The only change from the code above. DANGER

    console.log(await get("/Active"));

  }),

  login("Bob", async() => {

    await sleep();

    console.log(await get("/Build"));

  }),

  login("Colin", async() => {

    await sleep();

    console.log(await get("/Compile"));

  }),

]);

因此,雖然這對于編碼來說非常有趣和有趣,但我相信最好的選擇就是明確obj您正在使用的上下文(正如您在問題中已經(jīng)描述的那樣)并讓自己免于頭痛。



查看完整回答
反對 回復(fù) 2023-07-14
  • 1 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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