JS promise

本文探讨了异步操作的解决方案,如回调函数、Promise和async/await的使用,以及Cookie的工作原理和在HTTP协议中的作用。重点讲解了如何处理异步任务返回结果和Cookie的存储与管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.异步与同步

同步操作: 当一个操作开始执行后,主程序需等待它的完成,才能继续向下执行。

异步操作:
当一个操作开始执行后,主程序无需等待它的完成,可以继续向下执行。
此时该操作可以跟主程序同时(并发)执行。

问题: 异步任务完成后返回结果处理问题?
解决办法: 回调函数 (回调函数可以解决异步任务问题)

2.回调函数

将函数callBack作为参数传给函数fun, 在函数fun中以形参方式进行调用, 函数callBack就称为回调函数

3.Promise

promise是对异步操作的封装,封装异步文件读写, ajax异步网络请求…

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。

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

ajax封装

function myPromise(options) {
    return new Promise((resovle, reject) => {
        const xhr = new window.XMLHttpRequest()
        let params = formatParmas(options.data) //uid=101
        let method = options.method.toUpperCase()
        if (method == 'GET') {
            xhr.open(method, options.url + '?' + params)
            xhr.send()
        } else if (method == 'POST') {
            xhr.open(method, options.url)
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            xhr.send(params)
        }
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    let data = xhr.responseText
                    data = JSON.parse(data)
                    resovle(data)
                } else {
                    reject('网络请求失败')
                }
            }
        }
    })

}
// myPromise({
//     method:'get',
//     date:{

//     },
//     url:''
// })
4.async/await

使用方式:
- async关键字写在函数头部, 表示该函数是一个异步执行的函数
- await关键字表示等待的意思, 只能用在async异步函数中, 后面跟promise对象
=> 等待promise封装的异步操作执行完,返回结果

//表示当前函数是一个异步执行函数
async function getList(){
try{
conso1e.1og('异步函数开始执行111')
let res =await myPromise({method:'get',url:'http://localhost:8089/api/
console.1og("异步函数获取到结果222',res)
}catch(err){
console.log(err)
}
}
conso1e.1og('主程序结束执行>>>')
5.Cookie

cookie 是一个以字符串的形式存储数据的位置
也可以理解为存储数据的一个区域或者说是空间

cookie是以字符串的形式存储,在字符串中以key=value的形式出现
每一个key=value是一条数据
多个数据之间以;分割

//cookie的形态
'a=100;b=200;c=300;'

1.存储大小有限制,一般是4KB左右
2.数量有限制,一般是50条左右
3.有时效性,也就是有过期时间,一般是会话级别(也就是浏览器关闭就过期了)
4.有域名限制,也就是说谁设置的谁才能读取

语法:document.cookie = 'a=100;expires=时间对象'
     document.cookie = 'b=200;expires=Thu, 18 Dec 2018 12:00:00 GMT";'

设置cookie


*setCookie用于设置cookie
*@param{STRING]key要设置的cookie名称
*@param{STRING]value要设置的cookie内容
*@param{NUMBER}expires过期时间
*/
function setCookie (key,value,expires){
const time new Date()
time,setTime(time.getTime()-1000*60*60*8+expires)//用于设置过期时间
document.cookie ='${key}=${value};expires=${time);
}
        

cookie使用的是世界标准时间,而我们使用的new Date()则是我们自己的时间,也就是中国所在时区的时间,+8时区
我们需要减去这8个小时在设置cookie时间,才是我们正确设置的时间。

读取cookie

/*
*getCookie获取cookie中的某一个属性
*@param{STRING)key你要查间的cookie属性
*@return{STRING}你要查询的那个cookie属性的值
*/
function getCookie(key){
const cookieArr document.cookie.split(';)/a=100;b=200;c=300
//[a=100,b=200,c=308]
let value =''
                                      
cookieArr.forEach(item ->/item->a-100
if (item.split('-')[0].trim()==key){
value =item.split('=')[1]
}
})
return value
}

删除cookie

/**
*delCookie删除cookie中的某一个属性
*param{STRING}name你要除的某-个cookie属性的名称
*/
function delCookie(name){
setCookie(name,1,-1)
}
把时间-1

与http协议关系

每一个 HTTP 请求都会在请求头中携带 cookie 到服务端
每一个 HTTP 响应都会在响应头中携带 cookie 到客户端
也就是说,cookie 是不需要我们手动设置,就会自动在 客户端 和 服务端之间游走的数据
我们只是需要设置一下 cookie 的内容就可以

### JavaScriptPromise 的用法与示例 #### 什么是 PromisePromise 是一种用于处理异步操作的对象,它表示一个最终会完成或者失败的操作的结果。通过使用 Promise,可以更清晰地管理复杂的异步流程。 #### 基本结构 Promise 对象有三种状态:`pending`(等待)、`fulfilled`(已成功)和 `rejected`(已失败)。当 Promise 被执行时,其状态会从 `pending` 变为 `fulfilled` 或者 `rejected`[^1]。 以下是基本语法: ```javascript const myPromise = new Promise((resolve, reject) => { // 异步操作逻辑 if (/* 条件 */) { resolve(value); // 成功时调用 } else { reject(error); // 失败时调用 } }); ``` #### 使用 `.then()` 和 `.catch()` `.then()` 方法用于处理成功的回调,而 `.catch()` 则捕获错误并提供相应的处理机制。 ```javascript myPromise .then(result => console.log(`Success: ${result}`)) // 处理成功的情况 .catch(error => console.error(`Error: ${error.message}`)); // 处理失败的情况 ``` #### 链式调用 由于返回的是一个新的 Promise 实例,因此可以通过链式调用来简化多个异步操作的顺序执行。 ```javascript new Promise(resolve => setTimeout(() => resolve(1), 1000)) .then(val => val * 2) .then(val => val + ' is the result') .then(console.log); // 输出:"2 is the result" ``` #### 并行执行多个 Promise 如果需要同时启动多个异步任务,则可以使用 `Promise.all([])` 方法来等待所有的 Promise 完成后再继续下一步。 ```javascript Promise.all([ fetch('/api/data1').then(response => response.json()), fetch('/api/data2').then(response => response.json()) ]) .then(([data1, data2]) => { console.log(data1, data2); }) .catch(err => console.error('An error occurred:', err)); ``` #### 错误处理的最佳实践 为了更好地控制异常传播路径,在设计复杂的应用程序时应始终考虑如何优雅地处理潜在的错误情况。 ```javascript function fetchData(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = () => (xhr.status === 200 ? resolve(xhr.responseText) : reject(new Error('Failed'))); xhr.onerror = () => reject(new Error('Network Error')); xhr.send(); }); } fetchData('/some/valid/url') .then(data => JSON.parse(data)) .then(processedData => console.log(processedData)) .catch(e => alert(e.message)); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值