面试前端遇到的问题
面试官让我写一个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;
}