until
# 题目:
首先来看到这个题目的描述,这个挑战的意思是,有些时候我们需要拿到后端请求回来的数据之后,对数据格式或者其他之类的做一些处理,那么我们怎么实现这样一个 until 函数呢?
# 分析:
首先我们分析下这个函数需要完成的逻辑,通过 await 去执行这个异步函数,并传入 count,还有 toBe 函数改变的值,确保 count 的值为输入的这个值。es6 中 await 右侧表达式一般都是 promise 对象,所以我们这个 until 函数最后返回的应该是用 promise 对象。
# 解决:
/**
* 实现`until`函数
*/
function until(initial) {
// 定义一个 toBe 函数
function toBe(value) {
// 返回一个 Promise 对象,并在 resolve 中设置 initial 的值为 value
return new Promise((resolve) => {
initial.value = value;
resolve(initial.value);
});
}
// 返回一个包含 toBe 函数的对象,方便在模板中使用
return {
toBe,
};
}
// 定义一个 increase 函数
async function increase() {
// 将 count 的值重置为 0
count.value = 0;
// 设置一个定时器,每隔 1000 毫秒增加 count 的值
setInterval(() => {
count.value++;
}, 1000);
// 使用 until 函数,等待 count 的值等于 3
await until(count).toBe(3);
// 打印 count 的值是否等于 3
console.log(count.value === 3); // 确保输出为 true
}
可以看到这里的逻辑,当我们在调用 until 函数的时候,把 count 响应式对象传进去,然后再内部的 toBe 方法完成赋值后,在 Promise 对象中用 resolve 来表示完成的状态。那么 await until(count).toBe(3);这个逻辑就会等待 count 的值就变为 3。