【Promise】入门-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题

promise的使用与注意事项
摘要由CSDN通过智能技术生成

在这里插入图片描述

1. 预备知识

1.1 实例对象与函数对象

  • 实例对象:new 函数产生的对象,称为实例对象,简称为对象
  • 函数对象:将函数作为对象使用时,称为函数对象
function Fn() {
    // Fn只能称为函数
}
const fn = new Fn() // Fn只有new过的才可以称为构造函数
//fn称为实例对象
console.log(Fn.prototype)// Fn作为对象使用时,才可以称为函数对象
Fn.bind({
   }) //Fn作为函数对象使用
$('#test') // $作为函数使用
$.get('/test') // $作为函数对象使用

()左边是函数,点左边是对象(函数对象、实例对象)

1.2 两种类型的回调函数

1. 同步回调

立即执行,完全执行完了才结束,不会放入回调队列中

数组遍历相关的回调 / Promise的executor函数

const arr = [1, 3, 5];
arr.forEach(item => {
    // 遍历回调,同步回调,不会放入队列,一上来就要执行
  console.log(item);
})
console.log('forEach()之后')

在这里插入图片描述

2. 异步回调

不会立即执行,会放入回调队列中将来执行

定时器回调 / ajax回调 / Promise成功或失败的回调

// 定时器回调
setTimeout(() => {
    // 异步回调,会放入队列中将来执行
  console.log('timeout callback()')
}, 0)
console.log('setTimeout()之后')

在这里插入图片描述

// Promise 成功或失败的回调
new Promise((resolve, reject) => {
   
  resolve(1)
}).then(
  value => {
   console.log('value', value)},
  reason => {
   console.log('reason', reason)}
)
console.log('----')
// ----
// value 1

js 引擎先把初始化的同步代码都执行完成后,才执行回调队列中的代码

1.3 JS中的异常error处理

1. 错误的类型

Error:所有错误的父类型

ReferenceError:引用的变量不存在

console.log(a) // ReferenceError:a is not defined

TypeError:数据类型不正确

let b
console.log(b.xxx)
// TypeError:Cannot read property 'xxx' of undefined

let c = {
   }
c.xxx()
// TypeError:c.xxx is not a function

RangeError:数据值不在其所允许的范围内

function fn() {
   
  fn()
}
fn()
// RangeError:Maximum call stack size exceeded

SyntaxError:语法错误

const c = """"
// SyntaxError:Unexpected string

2. 错误处理(捕获与抛出)

抛出错误:throw error

function something() {
   
  if (Date.now()%2===1) {
   
    console.log('当前时间为奇数,可以执行任务')
  } else {
    //如果时间为偶数抛出异常,由调用来处理
    throw new Error('当前时间为偶数,无法执行任务')
  }
}

捕获错误:try ... catch

// 捕获处理异常
try {
   
  something()
} catch (error) {
   
  alert(error.message)
}

3. 错误对象

  • massage 属性:错误相关信息
  • stack 属性:函数调用栈记录信息
try {
   
  let d
  console.log(d.xxx)
} catch (error) {
   
  console.log(error.message)
  console.log(error.stack)
}
console.log('出错之后')
// Cannot read property 'xxx' of undefined
// TypeError:Cannot read property 'xxx' of undefined
// 出错之后

因为错误被捕获处理了,后面的代码才能运行下去,打印出‘出错之后’

2. Promise的理解和使用

2.1 Promise是什么

1. 理解Promise

  • 抽象表达:Promise是JS中进行异步编程的新的解决方案(旧方案是单纯使用回调函数)
    【推荐阅读 【JavaScript】同步与异步-异步与并行-异步运行机制-为什么要异步编程-异步与回调-回调地狱-JavaScript中的异步操作
    ---- 异步编程 ①fs 文件操作 ②数据库操作 ③Ajax ④定时器

  • 具体表达:
    ①从语法上看:Promise是一个构造函数 (自己身上有allrejectresolve这几个方法,原型上有thencatch等方法)
    ②从功能上看:promise对象用来封装一个异步操作并可以获取其成功/失败的结果值

  • 阮一峰的解释:
    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果
    从语法上说,Promise 是一个对象,从它可以获取异步操作的消息
    Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理

2. Promise 的状态

实例对象promise中的一个属性 PromiseState

  1. pending 变为 resolved/fullfilled
  2. pending 变为 rejected

注意

  • 对象的状态不受外界影响
  • 只有这两种,且一个 promise 对象只能改变一次
  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果
  • 无论成功还是失败,都会有一个结果数据。成功的结果数据一般称为 value,而失败的一般称为 reason

3. Promise对象的值

实例对象promise的另一个值 PromiseResult
保存着对象 成功/失败 的值(value/reason

resolve/reject可以修改值

4. Promise 的基本流程

在这里插入图片描述

5. Promise 的基本使用

const promise = new Promise(function(resolve, reject) {
   
  // ... some code
  if (/* 异步操作成功 */){
   
    resolve(value);
  } else {
   
    reject(reason);
  }
});

Promise构造函数接受一个函数(执行器函数)作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数value传递出去;
reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数error/reason传递出去。

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {
   
  // success
}, function(reason) {
   
  // failure
});

then方法可以接受两个回调函数作为参数。
第一个回调函数onResolved()Promise对象的状态变为resolved时调用
第二个回调函数onRejected()Promise对象的状态变为rejected时调用
这两个函数都是可选的,不一定要提供。它们都接受Promise对象传出的值作为参数

  • 一个例子
// 创建一个新的p对象promise
const p = new Promise((resolve, reject) => {
    // 执行器函数
  // 执行异步操作任务
  setTimeout(() => {
   
    const time = Date.now() 
    // 如果当前时间是偶数代表成功,否则失败
    if (time % 2 == 0) {
   
      // 如果成功,调用resolve(value)
      resolve('成功的数据,time=' + time)
    } else {
   
      // 如果失败,调用reject(reason)
      reject('失败的数据,time=' + time)
    }
  }, 1000);
})

p.then(
  value => {
    // 接收得到成功的value数据 onResolved
    console.log('成功的回调', value)  // 成功的回调 成功的数据,time=1615015043258
  },
  reason => {
    // 接收得到失败的reason数据 onRejected
    console.log('失败的回调', reason)    // 失败的回调 失败的数据,time=1615014995315
  }
)

.then() 和执行器(executor)同步执行,.then() 中的回调函数异步执行

2.2 为什么要用 Promise

1.指定回调函数的方式更加灵活

旧的:必须在启动异步任务前指定

// 1. 纯回调的形式
// 成功的回调函数
function successCallback(result) {
   
  console.
  • 61
    点赞
  • 275
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用Promise对象将函数转换为异步Promise是一种用于处理异步操作的对象,它可以表示一个异步操作的最终完成或失败,并返回相应的结果。通过将函数包装在Promise,可以使用resolve函数将异步操作的结果传递给调用方。以下是将函数转换为Promise的示例代码: ```javascript function asyncFunction() { return new Promise((resolve, reject) => { // 异步操作的代码 // 当操作完成时,调用resolve函数并传递结果 // 当操作失败时,调用reject函数并传递错误信息 }); } ``` 在上述代码,asyncFunction是一个异步函数,它返回一个Promise对象。在Promise的构造函数,可以执行异步操作,并在操作完成时调用resolve函数,将结果传递给调用方。如果操作失败,可以调用reject函数,并传递错误信息。 使用Promise对象可以更方便地处理异步操作,可以通过链式调用then方法来处理异步操作的结果。例如: ```javascript asyncFunction() .then(data => { // 处理异步操作成功的结果 }) .catch(error => { // 处理异步操作失败的错误信息 }); ``` 在上述代码,通过调用then方法,可以指定在异步操作成功时执行的回调函数,并通过catch方法指定在异步操作失败时执行的回调函数。 通过将函数转换为Promise,可以更好地管理和处理异步操作,提高代码的可读性和可维护性。 #### 引用[.reference_title] - *1* *2* *3* [Promise-异步操作的一种解决方案](https://blog.csdn.net/chonger_feifei/article/details/123331807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值