AsyncAwait.vue 5.1 KB
<!-- eslint-disable @typescript-eslint/no-unused-vars -->
<!--
 * async await return
  -->
<script setup lang="ts">
import { onMounted, ref } from 'vue';

const primeNum = ref(1000000);
const msg = ref('');
const requestMsg = ref('');

onMounted(() => {
  fun1();
});
function getMag(name: any) {
  return `Hello, my name is ${name}.`;
}
function fun1() {
  const name = '张三';
  const msg = getMag(name);
  console.log(msg); // Hello, my name is 张三.
}

// 生成素数
function generatePrimes() {
  function isPrime(n: any) {
    // Math.sqrt() 函数返回一个数的平方根
    for (let c = 2; c <= Math.sqrt(n); ++c) {
      if (n % c === 0) {
        return false;
      }
    }
    return true;
  }

  let primes: number[] = [];
  const maximum = 1000000;
  while (primes.length < primeNum.value) {
    const candidate = Math.floor(Math.random() * (maximum + 1));
    if (isPrime(candidate)) {
      primes.push(candidate);
    }
  }
  msg.value = `已生成素数${primes.length}个`;
}

function xhrClick() {
  requestMsg.value = '';
  const xhr = new XMLHttpRequest();
  xhr.addEventListener('loadend', () => {
    requestMsg.value = `${requestMsg.value}完成!状态码:${xhr.status}`;
  });
  xhr.open(
    'GET',
    'https://raw.githubusercontent.com/mdn/content/main/files/en-us/_wikihistory.json'
  );
  xhr.send();
  requestMsg.value = '请求已发起\n';
}
function heavyLoad() {
  document.location.reload();
}

function fetchApi() {
  fn().then(
    function (data) {
      console.log('resolve回调', data);
      // console.log(somedata); // somedata未定义
    },
    function (error) {
      console.log('reject回调', error);
    }
  );
}

function fn() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // Math.random 生成0~1的随机数
      // Math.ceil 向上取整
      let num = Math.ceil(Math.random() * 10); // 生成1~10的随机整数
      if (num <= 5) {
        resolve(`执行成功,num的值为:${num}`);
      } else {
        reject(`执行失败,该数字大于5,num的值为${num}`);
      }
    }, 1000);
  });
}

async function fetchProducts() {
  try {
    // 在这一行之后,我们的函数将等待 `fetch()` 调用完成
    // 调用 `fetch()` 将返回一个“响应”或抛出一个错误
    const response = await fetch(
      'https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json'
    );
    if (!response.ok) {
      throw new Error(`HTTP 请求错误:${response.status}`);
    } else {
      console.log(response);
    }
    // 在这一行之后,我们的函数将等待 `response.json()` 的调用完成
    // `response.json()` 调用将返回 JSON 对象或抛出一个错误
    const json = await response.json();
    console.log(json[0].name);
  } catch (error) {
    console.error(`无法获取产品列表:${error}`);
  }
}
// await fetchAPI示例
</script>
<template>
  <div class="fit">
    <div class="q-mb-md">async await return</div>
    <div class="q-mb-md">
      <a
        href="https://blog.csdn.net/huchaoyue_/article/details/127686795"
        target="_blank"
        >详细内容请查看CSDN</a
      >
    </div>
    <div class="content q-gutter-md">
      <q-card class="my-card bg-primary text-white">
        <q-card-section>
          <div class="q-mb-md q-gutter-sm">
            <q-btn
              color="white"
              text-color="primary"
              label="生成素数"
              @click="generatePrimes"
            />
          </div>
          <div>
            <q-input
              dark
              filled
              label-color="white"
              v-model="primeNum"
              label="素数个数"
            />
          </div>
          <div>{{ msg }}</div>
        </q-card-section>
      </q-card>

      <q-card class="my-card bg-orange-4 text-white">
        <q-card-section>
          <div class="q-mb-md q-gutter-sm">
            <q-btn
              color="white"
              text-color="orange-4"
              label="点击发起请求"
              @click="xhrClick"
            />
            <q-btn outline text-color="white" label="重载" @click="heavyLoad" />
          </div>
          <div>{{ requestMsg }}</div>
        </q-card-section>
      </q-card>

      <q-card class="my-card bg-purple-3 text-white">
        <q-card-section>
          <div class="q-mb-md q-gutter-sm">
            <q-btn
              no-caps
              color="white"
              text-color="purple-3"
              label="fetch API"
              @click="fetchApi"
            />
          </div>
        </q-card-section>
      </q-card>

      <q-card class="my-card bg-pink-3 text-white">
        <q-card-section>
          <div class="q-mb-md q-gutter-sm">
            <q-btn
              no-caps
              color="white"
              text-color="pink-3"
              label="async await"
              @click="fetchProducts"
            />
          </div>
        </q-card-section>
      </q-card>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.content {
  display: flex;
  flex-flow: row wrap;
  align-items: flex-start;
}
.my-card {
  width: 300px;
}
</style>