亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何模仿 Jest 描述模式?

如何模仿 Jest 描述模式?

開滿天機 2023-07-14 15:43:29
如何在 javascript 中編寫login和get函數?我有一種感覺,通過一些內聯函數、bind 和這個魔法的混合是可能的?;蛘哒f這是不可能的?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貢獻1868條經驗 獲得超4個贊

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


get這是一個將函數作為局部變量的工作示例。get我們在調用回調之前立即分配給該變量。

它將登錄上下文保存在其閉包范圍內。因為 JavaScript 是單線程的,我們知道在回調運行之前不能再次重新分配變量。


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


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"));

  }),

]);

我不推薦的原因是因為這是非常脆弱的代碼。我們必須非常小心,以確保get僅在回調開始時調用該函數。


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


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您正在使用的上下文(正如您在問題中已經描述的那樣)并讓自己免于頭痛。



查看完整回答
反對 回復 2023-07-14
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號