JS新Web API:EventTarget.when(下)

2025-08-31  本文已影响0人  塞风

1.用法:const observer = eventTarget.when(eventType);

2.实例方法

const ob = document.body.when('click');
const r = await ob.take(3).reduce(function (total, delta, t) {
  console.log('total: ', total);
  console.log('点击次数:', t);
  return {
      totalDx: total.totalDx + delta.clientX,
      totalDy: total.totalDy + delta.clientY
  }
}, { totalDx: 0, totalDy: 0 })
console.log('触发三次后结果', r);
image.png
async function handleClick() {
  const ob = document.when('click');
  const r = await ob.take(3).map((event, t) => {
    console.log('点击次数:', t);
      return { x: event.clientX, y: event.clientY }
    }).toArray()
    console.log(r);
  }
  handleClick()
image.png
 async function handleClick() {
   let times = 0
   const el = document.getElementById('list');
   const r = await el.when('click')
     .filter((event) => event.target.tagName === 'LI')
     .take(4)
     .forEach((event, t) => {
        console.log('点击次数:', t, event.target.textContent);
        // 这里可以执行副作用操作,如修改UI
        event.target.style.backgroundColor = 'lightblue';
        // 2秒后恢复颜色
       setTimeout(() => {
          event.target.style.backgroundColor = '';
        }, 2000);
        times = t + 1
          return t // 无效返回,为了演示保留
      }).then(res => {
        console.log(res, '--res');
        return times
      })
    console.log('总共点击次数:', r); 
  }
  handleClick()
image.png image.png
 function handleInput() {
  const ob = input.when('input');
  ob.switchMap(event => {
  const val = event.target.value;
  console.log('val: ', val);
  return fetch(`https://jsonplaceholder2.typicode.com/posts/${val}`)
    .then(response => {
      if (response.status !== 200) {
      // throw new Error('请求失败') // subscribe的error回调捕捉
      // return Promise.reject(('请求失败')) // subscribe的error回调捕捉
      return Promise.resolve({ code: 404, data: null, msg: '请求失败' }) //subscribe的next回调捕捉
    }
    return response.json()
    })
  })
  .catch(err => {
    console.log('err1: ', err);
    return { fallback: 'error data' }
    })
    .finally((s) => {
      console.log(s, 'finally');
    })
    .subscribe({
      next(value) {
        console.log('订阅结果是', value);
      },
      error(err) {
        console.log('err2: ', err);
      },
   });
 }
 handleInput()
image.png
这里可结合catchfinally方法使用,注意顺序,catchfinally需在subscribe前调用。当接口返回Promise.reject值或抛出异常时,会被catchfinally方法依次捕捉,同时subscribeerror回调也会触发,若error回调省略则控制台会报错,如下图:
image.png

switchMap的适用场景如搜索框输入提示、表单提交按钮的防重复点击、标签页切换加载数据,比如在input中快速输入值,只有最后一次输入会得到响应结果,前面的输入会发起请求不会得到响应结果,如下图:

function handleInput() {
  const ob = input.when('input');
  ob.flatMap(event => {
    const val = event.target.value;
    console.log('val: ', val);
    return fetch(`https://jsonplaceholder.typicode.com/posts/${val}`)
      .then(response => response.json())
    })
    .subscribe({
      next(value) {
      console.log('订阅结果是', value);
    },
    error(err) {
      console.log('err: ', err);
      },
    });
  }
  handleInput()
image.png
image.png
function handleInput() {
  const ob = input.when('input');
  ob.switchMap(event => {
    const val = event.target.value;
    console.log('val: ', val);
    return fetch(`https://jsonplaceholder.typicode.com/posts/${val}`)
      .then(response => response.json())
    })
    .subscribe({
      next(value) {
      console.log('订阅结果是', value);
    },
    error(err) {
      console.log('err: ', err);
      },
    });
  }
  handleInput()
image.png
image.png
function handleInput() {
  const ob = input.when('input');
  ob.map(event => event.target.value)
  .inspect(rawValue => console.log('原始输入:', rawValue))
  .filter(value => value.length > 1)
  .inspect(filteredValue => console.log('过滤后输入:', filteredValue))
  .switchMap(searchTerm => fetch(`https://jsonplaceholder.typicode.com/posts/${searchTerm}`))
  .inspect(response => console.log('API响应:', response.status))
  .switchMap(response => response.json())
  .inspect(data => {
    console.log('解析后的数据:', data);
   })
   .subscribe(results => {
    console.log('最终结果:', results);
   });
  }
 handleInput()
image.png
上一篇 下一篇

猜你喜欢

热点阅读