Promise在异步函数的运用

Promise在异步函数的运用

1.Promise的定义

 1.1  Promise 是表示异步操作最终完成或失败的对象。

2.使用方法–MDN官方图解在这里插入图片描述

3.使用示例–Resolve

 function ajax() {
        return new Promise((resolve, reject) => {
            setTimeout(() => resolve(), 1000)
        })
    }

     ajax().then(() => {
         console.log('任务1');
       return new Promise((resolve, reject) => {
             setTimeout(() => resolve(), 1000)
        })
     }).then(() => console.log('任务2'))

3.1 .then() 方法最多接受两个参数; 第一个参数是承诺的已解决案例 resolve的回调函数,第二个参数是被拒绝案例reject的回调函数。 每个 .then() 返回一个新生成的 promise 对象,这样可以选择性地用于链接。

4.使用案例–Reject

 function judgenumber(num) {
        return new Promise((resolve, reject) => {
            if (typeof (num) === 'number') {
                resolve(num)
            } else {
                let err = new Error('不是数字')
                reject(err)
            }
        })
    }
    judgenumber(2).then((num) => console.log(num)).catch(err => console.log(err))

4.1这个reject是用于处理异常的,后面要接.catch()从而对异常的情况进行处理

5.实际的用途–图片的全部加载,提升用户体验

 const imgurl1 = 'https://th.bing.com/th/id/Rf9b9d9068b2d3c2858f7689b2f28d2e6?rik=23wqfZbUNqo40g&riu=http%3a%2f%2fwww.ukutu.cn%2fupload%2f201510%2f05%2f201510051125552148.jpg&ehk=iXw34eHdrpJuGdK3aA4ipMB5t1vEwl9XeRipGAH1nL4%3d&risl=&pid=ImgRaw'
    const imgurl2 = 'https://th.bing.com/th/id/Rb434ae6d484616d1c28cb72378aecb92?rik=%2bnvI7AmO7LwqZA&riu=http%3a%2f%2fwww.ukutu.cn%2fupload%2f201602%2f29%2f20160229173734358.jpg&ehk=%2bQPG4%2fX76uSfRRZnC16OzjqvwaHGD%2b9Es96kArhj9CI%3d&risl=&pid=ImgRaw'
    const imgurl3 = 'https://th.bing.com/th/id/R432777ea00985fee4ae0ae797fe8be98?rik=2wxQvz13wzwtdA&riu=http%3a%2f%2fwww.58gc.me%2fuploads%2fimage%2f20191107%2f20191107211213_74207.jpg&ehk=QRz9js6MKVFd64coy%2bssME5x6XfGfXpwACGrE1ubrmY%3d&risl=&pid=ImgRaw'
    function getImg(url) {
        return new Promise((resolve, reject) => {
            let img = document.createElement('img')
            img.src = url

    
            img.onload = ()=>resolve(img)
            img.onerror =(err)=> reject(err)
        })
    }

    function showImage(values){
        for(let img of values){

            console.log(img);
            document.body.appendChild(img)
        }
        // values.foreach(item=>{
        //     document.body.appendChild(item)
        // })
    }
    //确保所有的图片都加载了,就可以执行then里面的函数
    //  Promise.all([getImg(imgurl1),getImg(imgurl2),getImg(imgurl3)]).then(showImage)  
    //只要有一张图片加载了就执行then
    Promise.race([getImg(imgurl2),getImg(imgurl1),getImg(imgurl3)]).then(img=>{
        document.body.appendChild(img)
    })
									**HTML 文件**
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  
</head>
<body>

</body>
<script src="JS路径"  type="module"></script>
</html>

5.1 这里用到了Promise.all() 这个方法数组作为输入,并返回一个解析为输入 promise 结果数组的单个 Promise。 当数组中的元素状态都改变,完成功能时,才会启动调用.then()
5.2Promise.race() 方法是数组中任何的元素变化都会引起.then的调用

6.与async,await配合实现同步功能

  function fn1() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('任务1');
                resolve();
            }, 1000);
        })
    }
    function fn2() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('任务2');
                resolve();
            }, 1000);
        })
    }
    function fn3() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('任务3');
                resolve();
            }, 1000);
        })
    }
    //当await等到resolve状态后才进行下一步
    async function Init(fn1, fn2, fn3) {
        await fn1()
        await fn2()
        await fn3()
    }

    Init(fn1, fn2, fn3)

6.1 await等到resolve或者reject函数执行完后,就会执行进行下一步,这样就是每一秒执行一个函数,而不会导致一秒后,三个函数同时执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,异步函数返回的一定是一个 Promise 对象。 所谓的异步函数,是指在 JavaScript 中使用了 `async` 关键字声明的函数。例如: ``` async function foo() { // 这是一个异步函数 } ``` 异步函数的返回值会自动被封装成一个 Promise 对象。如果异步函数的执行成功,则 Promise 对象会变为 fulfilled 状态,并将异步函数的返回值作为 fulfilled 状态的值;如果异步函数执行失败,则 Promise 对象会变为 rejected 状态,并将异步函数抛出的错误作为 rejected 状态的值。 例如,下面的码中,`foo` 函数返回的是一个 Promise 对象: ``` async function foo() { return 'Hello, world!'; } foo().then(value => { console.log(value); // 输出: "Hello, world!" }); ``` 在异步函数中,可以使用 `await` 关键字来等待一个异步操作的结果。例如: ``` async function foo() { const result = await someAsyncOperation(); return result; } ``` 在这种情况下,`someAsyncOperation` 函数必须返回一个 Promise 对象。 ### 回答2: 异步函数返回的不一定是Promise对象。异步函数可以返回Promise对象,也可以返回其他类型的值,比如在async函数中使用了return语句返回一个普通值。但是根据ECMAScript标准,如果异步函数没有使用return语句显式返回一个Promise对象,那么会隐式地将返回值封装为一个Promise对象。这意味着异步函数的返回值总是可被.then()方法或者await关键字处理的。所以,虽然异步函数可以返回其他类型的值,但它们总是会被封装成Promise对象以方便处理。 ### 回答3: 异步函数返回的不一定是Promise对象。异步函数可以返回Promise对象,也可以返回其它类型的值。如果返回的不是Promise对象,那么JavaScript引擎会将其包装成一个解决状态的Promise对象返回。 在异步函数内部,可以通过使用关键字`await`来等待一个Promise对象的完成,并返回该Promise对象的结果。此时,异步函数的返回值与待等待的Promise对象的状态和结果保持一致。 当异步函数返回一个Promise对象时,可以使用`then`方法来处理Promise对象的完成状态。如果异步函数返回其他类型的值,则不可在该值上使用`then`方法。 总之,异步函数返回的是否为Promise对象取决于函数内部的逻辑和返回值的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值