Js(二) 从es5(callback)到es6(promise)回调函数的变化以及应用理解

编程入门 行业动态 更新时间:2024-10-23 19:29:38

Js(二) 从es5(callback)到es6(promise)<a href=https://www.elefans.com/category/jswz/34/1771356.html style=回调函数的变化以及应用理解"/>

Js(二) 从es5(callback)到es6(promise)回调函数的变化以及应用理解

在说清楚如何写回调函数的时候,首先我觉得应该说清楚,什么是回调,为什么会产生回调,回调的应用场景。
大多数的回调场景发生在加载资源这一块,比如加载script,加载图片,再比如从后端请求回数据,然后对请求回来的数据分析。又比如script,图片加载失败,这个时候我们要清楚,要做出一个最基本的提示。
如果这个时候有一些不太了解浏览器加载的人会有如下的疑惑

let data = function() {// 加载数据 ...
}if(data) {// 加载成功
} else {// 加载失败
}

这里我不多做解释,就简单说明一下,浏览器遇到异步加载的会放到异步队列中,优先加载同步队列,同步队列结束后,在回来处理异步队列。如果想要更详细的说明,可以留言,哪怕只有一人留言,我也会写一篇浏览器加载的数据先后顺序的文章。

回调地狱

既然已经说清楚回调的应用场景,也体现了回调的重要性,接下来就说明一下回调函数如何写。在ES5的时候是如下的

// 加载script资源
function loadScript (src, callback) {let script = document.createElement('script')script.src = srcscript.onload = () => { callback(src) }document.head.append(script)
}
function test () {console.log('test')
}
// 第一种理解
loadScript('./scriptTest.js', test)
// 第二种理解
loadScript('./scriptTest.js', function (arg) {console.log('回调完成')
})

上述的理解
首先执行的 loadScript(’./scriptTest.js’, test) ,为什么呢?之前已经说过了,异步队列的执行。 接着就进入到loadScript 函数中了 ,当资源加载完后,就执行callback语句(实则是函数),,也就是目前的test函数。这样一个简单的回调就完成了。

接着再说明一下第二个内容
首先执行的loadScript(’./scriptTest.js’, function (arg) {
console.log(‘回调完成’)
}) ,
接着就进入到loadScript 函数中了 ,当资源加载完后,就执行callback语句(实则是函数)但是这个callback函数还返回一个自己这个函数中的参数,并将这个函数参数返还给function,这个函数就是后续的操作的关键,这个参数可以将前者的调用情况返回,这样后续就可以根据该返回情况,做出不同的响应

Promise

为了解决ES5在解决回调的时候造成的回调地狱的情况,ES6提出了新的解决方法 Promise
如下显示:

function loadScript() {return new Promise((reslove,reject)=> {// 正确执行的时候返回...resolve()// 错误执行的时候返回...reject(error)})
}// 调用Promise
loadScript('./scriptTest.js').thne(()=> {console.log('执行正确')},(err)=> {console,log('执行错误'+ err)})

而要明白Promise的时候就要明白primise的执行过程
我们在new 一个新的Promise的时候。promise本身是带有两个参数的,分别是

state => pending
result => undefined

当执行resolve的时候,状态改变如下

state =>  fulfilled
result => '当前传进来的值'

执行reject的时候,状态改变如下

state =>  rejected
result =>  error

以上就是Promise在工作时候的状态改变

而在 .then的工作原理,我们要有这样一个前提
.then是promise原型上的方法,也就是说必须promise才能调用then
所以说,如果你在then的连续上的话,就需要对结果return一下(也就是将当前的promise对象返给下一个对象接收)

Promise方法

我们在编程中经常回遇到的类型 转换。Promise也为我们提供了两个类型转换方法,如下:

Promise.resolve(13)
Promise.reject(13)

并行异步操作

const p1 = Promise.resolve('我')
const p2 = Promise.resolve('你')
const p3 = Promise.resolve('他')
Promise.all([p1, p2, p3]).then((value)=> {} )

两资源竞争加载

const p1 = () => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(1)}, 0)})
}
const p2 = () => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(2)}, 10000)})
}
Promise.race([p1(), p2()]).then(value => {console.log(value)
})

更多推荐

Js(二) 从es5(callback)到es6(promise)回调函数的变化以及应用理解

本文发布于:2023-07-28 16:31:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1250568.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:回调   函数   Js   callback   promise

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!