面試官讓我寫一個delay函數
然后這是我寫的代碼
async function delay(){setTimeout(function() {}, 3000);
}
面試官就和我說不是這個,用promise
當時就蒙了,什么東西,為什么要用promise
然后問豆包說
Promise 是 JavaScript 中用于處理異步操作的對象,它代表一個異步操作的最終完成(或失敗)及其結果值。
首先要知道setTimeout是一個異步的任務觸發器,它的目的是告訴瀏覽器幾秒后去把回調函數放到任務隊列中等待執行,它本身不會讓主線程停下來等 3 秒
正確代碼:
// 正確寫法:返回 Promise,3秒后 resolve
async function delay() {return new Promise((resolve) => { // 返回一個 pending 狀態的 PromisesetTimeout(() => {resolve(); // 3秒后調用 resolve,讓 Promise 變為 fulfilled 狀態}, 3000);});
}// 測試:此時 await 會等待 3秒
async function test() {console.log("1. 開始");await delay(); // 等待 Promise 變為 fulfilled(3秒后)console.log("2. 結束"); // 3秒后才會打印
}
test();
Promise 的默認行為?當你通過?new Promise(executor)
?創建 Promise 時,它的初始狀態就是?pending(等待中),直到 executor 函數內部調用了?resolve()
?或?reject()
?才會改變狀態。
resolve();
該函數可以幫助讓創建的promise?fulfilled狀態
另外補充promise的三種狀態
Promise 的三種狀態
- pending(等待中):初始狀態,既不是成功也不是失敗
- fulfilled(已成功):操作完成,會觸發?
then
?方法的回調 - rejected(已失敗):操作出錯,會觸發?
catch
?方法的回調
異步函數默認會返回一個fulfilled狀態的promise
后面一個算法題
寫了十幾分鐘沒寫出來
// Pet -> Pet
// Pet<Dog> -> [Pet, Dog]
// Pet<Dog<Cat>> -> [Pet, [Dog, Cat]]
// Pet<Dog, Cat> -> [Pet, Dog, Cat]
// Pet<Dog, Cat<RedCat, YellowCat>, Rabbit> -> [Pet, Dog, [Cat, RedCat, YellowCat], Rabbit]
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>using namespace std;string temp;
unordered_map<int,vector<string>> mp;int main()
{cin>>temp;int iter=0;string s="";for(int i=0;i<temp.size();i++){if(temp[i]=='<')iter++;else if(temp[i]=='>'){mp[iter].push_back(s);iter--;cout<<s<<"\n";s="";}else{s+=temp[i];}}for(pair<int,vector<string>> p:mp){int f=p.first;cout<<f;vector<string> str=p.second;cout<<"第"<<f<<"層的字符串:";for(int i=0;i<str.size();i++){cout<<str[i]<<" ";}cout<<"\n";}return 0;
}