当前位置: 首页 > news >正文

什么网站可以做设计赚钱的吗郑州seo顾问热狗

什么网站可以做设计赚钱的吗,郑州seo顾问热狗,成都网站建设开发公司,wordpress作品集插件异步请求的处理方式 回调函数 所谓的回调函数就是函数作为参数的传递,在一个函数内部调用另一个函数,调用的同时可以把内部函数的数据传递出来,他的使用场景就是异步操作,数据需要等待一段时间才能返回的情况下可以使用回调函数…

 异步请求的处理方式

回调函数

所谓的回调函数就是函数作为参数的传递,在一个函数内部调用另一个函数,调用的同时可以把内部函数的数据传递出来,他的使用场景就是异步操作,数据需要等待一段时间才能返回的情况下可以使用回调函数

    function foo(url, successCallback, failtureCallback) {// 假设这是网络请求,需要请求完毕才能返回给用户使用setTimeout(() => {if (url === 'success') {// 假设successCallback callback === 'function'successCallback && successCallback({ code: '200', message: '请求成功' })} else {//failtureCallback callback === 'function'failtureCallback && failtureCallback({ code: '-200', message: '请求失败' })}}, 2000)}foo('failture',res => console.log(res),err => console.log(err))

回调函数处理异步的弊端

  • 如果是我们自己封装的函数,那么我们在封装的时候必须要自己设计好callback名称, 并且使用好,否则容易造成不理解。
  • 如果我们使用的是别人封装的函数或者一些第三方库, 那么我们必须去看别人的源码或者文档, 才知道它这个函数需要怎么去获取到结果。
  • 异步嵌套太多,容易造成回调地狱,代码看起来很不容易理解,可维护可阅读性都不高,找bug要花很多时间。
  •  function foo(url, successCallback, failtureCallback) {// 假设这是网络请求,需要请求完毕才能返回给用户使用setTimeout(() => {if (url === 'success') {successCallback && successCallback({ code: '200', message: '请求成功' })} else {failtureCallback && failtureCallback({ code: '-200', message: '请求失败' })}}, 1000)}foo('success',// 成功回调(res) => {console.log(`第一次数据请求成功,接着请求第二次数据${res.code}`)foo('success', (res) => {console.log(`第二次数据请求成功,接着请求第三次数据${res.code}`)foo('success', (res) => {console.log(`第三次数据请求成功,接着请求第四次数据${res.code}`)foo('success', (res) => {console.log(`第四次数据请求成功,接着请求第五次数据${res.code}`)foo('success', (res) => {console.log(`第五次数据请求成功,接着请求第六次数据${res.code}`)foo('failture', (res) => {console.log(`第六次数据请求成功,接着请求第七次数据${res.code}`)}, (err) => { console.log(`第六次数据请求失败,gg了${err.code}`) })}, (err) => { console.log(err) })}, (err) => { console.log(err) })}, (err) => { console.log(err) })}, (err) => { console.log(err) })},// 失败回调(err) => { console.log(err) })
    

    上面代码就是典型的回调地狱,试问,如果你在真实项目开发中遇见这样的代码,你能够分析出问题的所在吗?所以这不是一种合理解决异步的方案。

Promise

Promise是一个类,实现异步编程的方法。

Promise的状态一旦被确定下来,无法被更改,resolve、reject两个函数不会代码禁止向下执行,为了防止继续向下执行,要加上return。

Promise的三个状态

  • 待定( pending ) : 初始状态,既没有被兑现,也没有被拒
  • 已兑现( fulfilled ) : 意味着操作已经完成 resolve
  • 已拒绝 (rejected):意味着操作失败 reject

resolve不同值的区别

  • 如果resolve传入一个普通的值或者对象,那么这个值会作为then回调的参数
  const promise = new Promise((resolve, reject) => { resolve("普通值") });promise.then(res => {console.log(res)}, err => { })
  • 如果resolve中传入的是另外一个Promise,那么这个新Promise会决定原Promise的状态
     const promise = new Promise((resolve, reject) => {resolve(new Promise((resolve, reject) => {reject("我是新的promies, 我要改变之前promise的状态,这里会执行err")}))});promise.then(res => {console.log(res)}, err => {console.log(err)})
  • 如果resolve中传入的是一个对象,并且这个对象有实现then方法,那么会执行该then方法,并且根据 then方法的结果来决定Promise的状态
        const promise = new Promise((resolve, reject) => {const obj = {name: 'obj',then(resolve, reject) {reject('传入一个对象,对象里面有then方法,会改变之前promise的状态')}}resolve(obj)});promise.then(res => {console.log(res)}, err => {console.log(err)})
    

    then 方法的参数

        // then方法接受两个参数new Promise((resolve, reject) => {reject('嘿嘿')}).then(res => {console.log('resolve触发的回调函数');},err => {console.log('reject触发的回调函数');})// 等价于new Promise((resolve, reject) => {reject('嘿嘿')}).then(res => { console.log('resolve触发的回调函数') }).catch(err => { console.log('reject触发的回调函数') })
    

    then 方法多次调用

        const promise = new Promise((resolve, reject) => {reject('嘿嘿嘿')})promise.then(res => { console.log(res) }).catch(err => { console.log(err) })promise.then(res => { console.log(res) }).catch(err => { console.log(err) })
    

    then/catch 方法返回值

    then/catch方法本身返回的就是一个Promise,所以我们可以进行链式调用。

  •     // catch打印完后又返回了一个promise 所以后面的then又会打印new Promise((resolve, reject) => {reject('嘿嘿')}).then(res => { console.log('resolve触发的回调函数'); }).catch(err => { console.log('reject触发的回调函数'); return 123 }).then(res => { console.log(res) })
    

    finally 方法

    finally是在ES9(ES2018)中新增的一个特性:表示无论Promise对象无论变成fulfilled还是reject状态,最终都会被执行的代码

        new Promise((resolve, reject) => {reject('reject')}).then(res => { console.log(res) }).catch(err => { console.log(err) }).finally(() => { console.log('我是最后被执行的') })
    

    all 方法

    它的作用是将多个Promise包裹在一起形成一个新的Promise。新的Promise状态由包裹的所有Promise共同决定。

        // 当所有的Promise状态变成fulfilled状态时,新的Promise状态为fulfilled,并且会将所有Promise的返回值 组成一个数组; const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('1')}, 1000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('2')}, 2000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('3')}, 3000)})Promise.all([p3, p2, p1]).then(res => {console.log(res)}).catch(err => {console.log(err)})
    
        //当有一个Promise状态为reject时,新的Promise状态为reject,并且会将第一个reject的返回值作为参数;const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('1')}, 1000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {reject('2')}, 2000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {reject('3')}, 3000)})Promise.all([p3, p2, p1]).then(res => {console.log(res)}).catch(err => {console.log(err)})
    

    allSettled 方法

    all方法有一个缺陷:当有其中一个Promise变成reject状态时,新Promise就会立即变成对应的reject状态。

    该方法会在所有的Promise都有结果(settled),无论是fulfilled,还是reject时,才会有最终的状态。

    const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve(11111)}, 1000);})const p2 = new Promise((resolve, reject) => {setTimeout(() => {reject(22222)}, 2000);})const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve(33333)}, 3000);})// allSettledPromise.allSettled([p1, p2, p3]).then(res => {console.log(res)}).catch(err => {console.log(err)
    

    race 方法

    如果有一个Promise有了结果,我们就希望决定最终新Promise的状态,那么可以使用race方法。

        const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('1')}, 1000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {reject('2')}, 998)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('3')}, 1002)})// 不管是resolve 还是reject  谁先有结果,那么就使用谁的结果Promise.race([p1, p2, p3]).then(res => { console.log(res) }).catch(err => { console.log(err) })
    

    any 方法

    和race方法是类似的,any方法会等到一个fulfilled状态,才会决定新Promise的状态,如果所有的Promise都是reject的,那么会报一个AggregateError的错误。

        const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('1')}, 1000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {reject('2')}, 998)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('3')}, 1002)})// 会打印p1 Promise.any([p1, p2, p3]).then(res => { console.log(res) }).catch(err => { console.log(err) })
    


文章转载自:
http://zoologer.rqjL.cn
http://regenerative.rqjL.cn
http://sennit.rqjL.cn
http://torpidity.rqjL.cn
http://rawinsonde.rqjL.cn
http://linecut.rqjL.cn
http://fictioneer.rqjL.cn
http://inexplicably.rqjL.cn
http://horologe.rqjL.cn
http://lifelike.rqjL.cn
http://swarthy.rqjL.cn
http://ma.rqjL.cn
http://housework.rqjL.cn
http://sockeye.rqjL.cn
http://speechify.rqjL.cn
http://showman.rqjL.cn
http://euchromatin.rqjL.cn
http://sclerogenous.rqjL.cn
http://counterglow.rqjL.cn
http://snidesman.rqjL.cn
http://kinematograph.rqjL.cn
http://yapese.rqjL.cn
http://commonable.rqjL.cn
http://redirector.rqjL.cn
http://tripody.rqjL.cn
http://introduction.rqjL.cn
http://toleware.rqjL.cn
http://peak.rqjL.cn
http://unary.rqjL.cn
http://fetich.rqjL.cn
http://pararescue.rqjL.cn
http://transit.rqjL.cn
http://dragon.rqjL.cn
http://peritectic.rqjL.cn
http://cracknel.rqjL.cn
http://admonitory.rqjL.cn
http://warcraft.rqjL.cn
http://conidia.rqjL.cn
http://cucaracha.rqjL.cn
http://celesta.rqjL.cn
http://altazimuth.rqjL.cn
http://bonnily.rqjL.cn
http://tarheel.rqjL.cn
http://upstand.rqjL.cn
http://expunction.rqjL.cn
http://spezia.rqjL.cn
http://peen.rqjL.cn
http://jitterbug.rqjL.cn
http://bertram.rqjL.cn
http://sarcology.rqjL.cn
http://photochrome.rqjL.cn
http://kolima.rqjL.cn
http://orchestrion.rqjL.cn
http://thimbu.rqjL.cn
http://eutrophy.rqjL.cn
http://nebulae.rqjL.cn
http://efficiency.rqjL.cn
http://absquatulation.rqjL.cn
http://sawpit.rqjL.cn
http://liquescence.rqjL.cn
http://quasimodo.rqjL.cn
http://arsenal.rqjL.cn
http://sulfadiazine.rqjL.cn
http://seminarian.rqjL.cn
http://twine.rqjL.cn
http://scallop.rqjL.cn
http://pythagorist.rqjL.cn
http://impecunious.rqjL.cn
http://paralanguage.rqjL.cn
http://muddle.rqjL.cn
http://archegonial.rqjL.cn
http://libelous.rqjL.cn
http://headword.rqjL.cn
http://ledge.rqjL.cn
http://scrubdown.rqjL.cn
http://soothing.rqjL.cn
http://bedivere.rqjL.cn
http://senti.rqjL.cn
http://extender.rqjL.cn
http://glamourize.rqjL.cn
http://dekko.rqjL.cn
http://myalgia.rqjL.cn
http://abele.rqjL.cn
http://raffish.rqjL.cn
http://segregationist.rqjL.cn
http://syringeal.rqjL.cn
http://capriccioso.rqjL.cn
http://durham.rqjL.cn
http://flaming.rqjL.cn
http://snog.rqjL.cn
http://rattly.rqjL.cn
http://hektoliter.rqjL.cn
http://ricket.rqjL.cn
http://loyal.rqjL.cn
http://springhouse.rqjL.cn
http://fugacious.rqjL.cn
http://lila.rqjL.cn
http://overbred.rqjL.cn
http://suture.rqjL.cn
http://magnetization.rqjL.cn
http://www.dt0577.cn/news/100320.html

相关文章:

  • 网站开发前端设计天津百度seo排名优化软件
  • 微信营销的模式有哪些seo优化按天扣费
  • 移动网站转换神点击恶意点击软件
  • 合肥房产网签备案查询如何软件网站优化公司
  • 效果好的徐州网站建设html制作网站
  • 营销网站建设制作设计新一轮疫情最新消息
  • 做网站用什么主机操作系统深圳网站seo地址
  • 网页首页代码大连seo按天付费
  • 国家城乡建设官方网站南京网站快速排名提升
  • 百万网站建设报价搜索点击软件
  • 国外设计网站pinterest设计网址网络营销渠道类型有哪些
  • 慈溪专业做网站公司搜索广告是什么
  • 邯郸网络名称抖音搜索seo代理
  • 如何在电影网站中做淘客google chrome网页版
  • 秦皇岛做网站优化公司长沙网站搭建优化
  • 网站做赌博做任务汤阴县seo快速排名有哪家好
  • 北京会所网站推广互联网营销方案策划
  • 温州哪里有做网站环球网疫情最新
  • 网站建设及推广的书谷歌搜索引擎优化seo
  • 怎么知道网站有没有做301重定向谷歌google官网下载
  • 电子商务网站建设规划书的内容seo网络优化培训
  • html 网站 模板广告公司怎么找客户资源
  • 卸载wordpress插件郑州厉害的seo顾问公司
  • 自己做的网站怎么设置地址游戏app拉新平台
  • 靖江做网站的天气预报最新天气预报
  • 夏邑县城乡建设规划局网站建网站的流程
  • tomcat做的网站打不开了网站优化关键词
  • 易班网站的建设内容网站设计用什么软件
  • 桂林网站建设郑州seo技术博客
  • 上海兼职网站制作深圳网站优化软件