使用Promise过程中resolve或reject后,后面代码还会执行,默认加return较妥

本文探讨了JavaScript中Promise的使用,展示了如何通过.then和.catch方法处理异步操作的成功和失败情况。通过三个示例函数p(), p1(), p2(),分别演示了Promise在遇到错误时的捕获与日志输出过程。

 

    console.log(111)
    p()
      .then(result => {
        console.log(`p result:${result}`)
      })
      .catch(err => {
        console.log(`p err :${err}`)
      })
    p1()
      .then(result => {
        console.log(`p1 result:${result}`)
      })
      .catch(err => {
        console.log(`p1 err :${err}`)
      })
    p2()
      .then(result => {
        console.log(`p2 result:${result}`)
      })
      .catch(err => {
        console.log(`p2 err :${err.message}`)
      })
    function p() {
      return new Promise((resolve, reject) => {
        console.log(222)
        setTimeout(() => {
          console.log('async in p')
          reject('err in p')
          console.log('content after p reject')
        }, 200)
      })
    }
    function p1() {
      return new Promise((resolve, reject) => {
        console.log(333)
        setTimeout(() => {
          console.log('async in p1')
          resolve('resolev in p1')
          console.log('content after p1 resolve')
        }, 250)
      })
    }
    function p2() {
      return new Promise((resoleve, reject) => {
        console.log(444)
        setTimeout(() => {
          console.log('async in p2')
          return reject(new Error('p2error'))
          console.log('content after p2 return')
        }, 300)
      })
    }

### JavaScript `return` 语句的含义 在 JavaScript 中,`return` 关键字用于指定函数执行后的返回值。它可以在函数体内终止当前函数的执行并将其控制权交还给调用者。如果未显式使用 `return` 仅写成 `return;` 而无任何表达式,则默认返回 `undefined`。 对于普通函数而言,`return` 的作用如下: - 返回计算结果特定值。 - 提前结束函数运行流程[^1]。 例如,在以下代码片段中展示了如何利用 `return` 来决定何时停止进一步逻辑处理: ```javascript function checkNumber(num){ if(typeof num !== 'number'){ return "输入是一个有效的数字"; } return Math.sqrt(num); } console.log(checkNumber("abc")); // 输入是一个有效的数字 console.log(checkNumber(9)); // 3 ``` ### Promise 构造器中的 ResolveReject 方法解析 #### Resolve 方法的功能描述 当创建一个新的 Promise 实例时,传入了一个带有两个参数 (`resolve`, `reject`) 的执行器函数。一旦异步任务顺利完成,应该通过调用 `resolve(value)` 把成功的数据传递出去,这会使 Promise 状态从初始态(Pending)转变为完成态(Fulfilled),并且触发后续 `.then()` 链接的第一个回调函数接收此 value 值作为参数[^5]。 示例演示了成功场景下 resolve 使用方式: ```javascript let p = new Promise((resolve, reject)=>{ let condition=true; if(condition){ resolve("操作成功"); }else{ reject(new Error("出现了错误")); } }); p.then(result=>console.log(result)).catch(error=>console.error(error.message)); // 控制台打印: 操作成功 ``` #### Reject 方法的行为说明 相对应于 resolve 表达的是失败情况下的 reject 处理机制。当我们检测到某些条件符合预期者发生了异常状况的时候,就可以借助 `reject(reason)` 将错误原因通知外部环境。如此一来,Promise 的状态就会转变成为拒绝态(Rejected),进而激活关联的 catch 错误处理器是 then 方法里的第二个可选项回调函数[^2]。 这里有一个简单的例子用来展示 reject 如何工作: ```javascript new Promise((resolve, reject) => { throw new Error('Test'); }).catch(e => console.log(e.message)) ; // 输出 Test ``` 综上所述,`resolve` 主要负责报告正常的结果而 `reject` 则是用来传达错误信息两者共同构建起了完整的 promise 生命周期管理框架[^4]。 ### 结合 ReturnPromises 的实际应用案例分析 考虑这样一个需求:我们需要编写一段程序去获取远程服务器上的资源,并且希望能够在本地测试期间模拟同的响应行为以便验证我们的业务逻辑是否健壮可靠。那么我们可以这样设计解决方案——定义一个辅助工具类 MockAjaxService 它可以根据预设配置动态调整每次请求的表现形式包括但限于延迟载时间长短以及最终反馈的成功与否等等因素影响整个过程走向。 ```javascript class MockAjaxService { static fetchResource(successfulFetch, delayMs=0){ return new Promise ((resolve, reject)=>{ setTimeout(()=>{ try{ if(!successfulFetch){ throw new Error("Simulated Network Failure"); } resolve({"status":"OK","data":["item1","item2"]}); }catch(ex){ reject(ex); } },delayMs); }); } } MockAjaxService.fetchResource(true).then(responseData=>{ console.log(`Received Data:${JSON.stringify(responseData)}`); }).catch(err=>console.warn(`Error Occurred:${err}`)); setTimeout(()=>MockAjaxService.fetchResource(false),3000); ``` 在这个实例里充分体现了前面所讨论过的知识点:首先是运用到了 return 来界定同分支路径下的输出内容;其次是合理安排 resolve/reject 来反映网络交互可能出现的各种情形从而达到更贴近真实世界的模拟效果[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值