async await promise 各种坑点

本文探讨了JavaScript中的异步编程,重点在于Promise和async/await的使用。通过实例展示了如何确保异步操作按预期顺序执行,并解释了wx.cloud.uploadFile在处理错误时的特性。在异步函数中,正确封装Promise是关键,以确保await能正确等待异步操作完成。同时,文章提到了云开发中文件上传的异步处理,指出在success回调中的错误可能不会被console.log捕获,强调了错误处理的重要性。

各个promise会异步执行,但是返回的结果,会按照数据[a,b]的顺序输出

  onLoad() {
    let a=new Promise(resolve=>{
      setTimeout(() => {
        console.log('1')
        resolve('a')
      }, 1000);
    })
    let b=new Promise(resolve=>{
      setTimeout(() => {
        console.log('2')
        resolve('b')
      }, 500);
    })
    Promise.all([a,b]).then(res=>{
      console.log(res)
    })
    console.log('c')
    //各个promise会异步执行,但是返回的结果,会按照数据[a,b]的顺序输出
  },

输出结果:
在这里插入图片描述

async-await ,await对应的函数需要封装一个promise

错误

 async onLoad() {
   let a=await this.setTime()
 console.log('a',a)
  },
  setTime(){
    setTimeout(() => {
      return 1
    }, 1000);
  }
  //a undefined

正确

 async onLoad() {
   let a=await this.setTime()
 console.log('a',a)
  },
  setTime(){
  return new Promise(resolve=>{ setTimeout(() => {
      resolve(1) 
    }, 1000);
  })
  }
  //a 1

要引用一个异步的函数,该函数可以用return new Promise包起来,再引用,引用出加.then即可

  onLoad() {
    this.setTime().then(res => {
      console.log('res', res)
    })
  },
  setTime() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(1)
      }, 1000);
    })
  }
  //res 1

wx.cloud.uploadFile的success回调,里面如果有报错,console不会提示出来

  // 上传到云开发的存储中
  uploadImage(fileURL) {   
      let p = new Promise((reslove, reject) => {
        wx.cloud.uploadFile({
          cloudPath: path + new Date().getTime() + suffix, // 上传至云端的路径
          filePath: fileURL[i].url, // 小程序临时文件路径
          success: res => {
          	// fileID.push(res.fileID)《注意此处,之前没注释,此fileID为未定义,
            //出错了,但是console不提示,导致下面reslove不执行》
            reslove(res.fileID)
          },
          fail: console.error
        })
      })
      task.push(p)
    }
    Promise.all(task).then(res => {
      console.log(res);
    })
  },
### JavaScript 异步编程:`async`、`await` 和 `Promise` 的区别 #### 什么是 `Promise` `Promise` 是一种处理异步操作的对象,表示一个异步操作的最终完成或者失败的结果。它可以有三种状态:待定(pending)、已实现(fulfilled)和已拒绝(rejected)。开发者可以通过 `.then()` 方法来获取成功的值,通过 `.catch()` 来捕获错误[^4]。 ```javascript const myPromise = new Promise((resolve, reject) => { if (true) { resolve('Success'); } else { reject('Error occurred'); } }); myPromise .then(result => console.log(result)) // 输出 'Success' .catch(error => console.error(error)); ``` #### 什么是 `async` 函数 `async` 关键字用于定义一个函数为异步函数。当一个函数被标记为 `async` 后,它会自动返回一个 `Promise` 对象。如果这个函数中有 `return` 值,则会被封装成一个 resolved 的 `Promise`;如果有抛出异常的情况,则会变成 rejected 的 `Promise`[^2]。 ```javascript async function fetchData() { return 'Data fetched'; } fetchData().then(data => console.log(data)); // 输出 'Data fetched' ``` #### 什么是 `await` 表达式 `await` 运算符用于等待一个 `Promise` 解决或拒绝。它只能在由 `async` 定义的函数内部使用。一旦遇到 `await`,程序就会暂停当前 `async` 函数的执行,直到所等待的 `Promise` 返回其结果[^3]。 ```javascript function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function runAfterDelay() { await delay(1000); console.log('This runs after a second.'); } runAfterDelay(); // 控制台将在一秒后显示 'This runs after a second.' ``` #### 主要区别总结 | 特性 | `Promise` | `async/await` | |---------------------|------------------------------------|-----------------------------------| | **语法复杂度** | 需要链式的 `.then/.catch` | 更加简洁直观 | | **错误处理** | 使用 `.catch` 处理错误 | 支持传统的 try-catch 结构 | | **代码可读性** | 较低 | 显著提升 | | **功能基础** | 承载异步逻辑的核心工具 | 构建于 `Promise` 之上 | 尽管三者都可以用来管理异步流程,但它们各有优劣。对于简单的场景,可以直接使用 `Promise` 或原生回调函数;而对于复杂的业务逻辑,推荐采用更易理解且结构化的 `async/await` 方式[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值