博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fetch和Promise
阅读量:6799 次
发布时间:2019-06-26

本文共 3507 字,大约阅读时间需要 11 分钟。

fetch

相关文章、 fetch相对于XMLHttpRequest(XHR)优点:改善离线体验,保持可扩展性

Promise

回调模式:多层回调会使我们陷入回调地狱

Promise追踪多个回调函数并做清理操作, Promise 能大幅度改善这种情况

method1(function(err, result) {    if (err) {    throw err;    }        method2(function(err, result) {            if (err) {            throw err;            }                method3(function(err, result) {                    if (err) {                    throw err;                    }                        method4(function(err, result) {                        if (err) {                        throw err;                        }                        method5(result);            });        });    });});

使用改进则是

new Primise(()=>{        if(err) {            reject(err)            return        }        resolve(result)    }).then(        ()=>{            if(err) {                reject(err)                return            }            resolve(result)        })        ...        catch(err=>{            console.log(err)        })

Promise 的生命周期

"pending"(挂起) 、 "fulfilled"(已完成) "rejected"(已拒绝),且只能从pengding变为fulfilled或rejected.切不能逆向

var promise = new Promise(function(resolve, reject) {console.log("Promise");resolve();}).then(()=>{console.log("resolved")});console.log("Hi!");//Promise=>Hi!=>resolved

完成处理函数与拒绝处理函数总是会在执行器的操作结束后被添加到作业队列的尾部。

Promise then和catch使用

then

then() 方法在所有的 Promise 上都存在,并且接受两个参数。第一个参数是 Promise 被完 成时要调用的函数,与异步操作关联的任何附加数据都会被传入这个完成函数。第二个参数 则是 Promise 被拒绝时要调用的函数,与完成函数相似,拒绝函数会被传入与拒绝相关联的 任何附加数据。

串联Promise

每次对 then() 或 catch() 的调用实际上创建并返回了另一个 Promise ,仅当前一个 Promise 被完成或拒绝时,后一个 Promise 才会被决

then(resolveFn(),rejectFn()) 串联then的状态和值变化:

  • "pending"(挂起) 挂起不动
  • "fulfilled"(已完成) 当then中resolveFn(),rejectFn()不为函数时状态和值传给下一级
  • "rejected"(已拒绝) 当then中resolveFn(),rejectFn()不为函数时状态和值传给下一级

    new Promise(function(resolve, reject){ resolve(5)}).then(null,function(value){ taskA()}).then(function(value){ console.log("taskB-------------------"+value)}).catch(function(reason){ console.log(reason)})// taskB-------------------5

错误处理

为了确保能正确处理任意可能发生的错误,应当始终在 Promise 链尾部添加拒绝处理函数。

catch Promise catch() 方法,其行为等同于只传递拒绝处理函数给 then()

promise.catch(function(err) {// 拒绝    console.error(err.message);});// 等同于:promise.then(null, function(err) {// 拒绝    console.error(err.message);});

Promise的静态方法

Promise.resolve()

Promise.resolve(5) //以下相同    new Promise(function(resolve){        resolve(5)    })

Promise.reject()

Promise.reject(new Error('error')) //以下相同    new Promise(function(resolve, reject){        reject(new Error('error'))    })

Promise.all()

它接收一个promise对象组成的数组作为参数,并返回一个新的promise对象
若传递给 Promise.all() 的任意 Promise 被拒绝了,那么方法所返回的 Promise 就会立刻被
拒绝,而不必等待其他的 Promise 结束
全部resolve()会依次放入一个数组里面

function timeout(time) {return new Promise(function (resolve) {    setTimeout(function () {        resolve(time);    }, time);});b}console.time('promise')Promise.all([    timeout(10),    timeout(60),    timeout(100)]).then(function (values) {    console.log(values); [10, 60, 100]    console.timeEnd('promise');   // 100.965087890625ms});

Promise.race()

它接收一个promise对象组成的数组作为参数,并返回一个新的promise对象
赛跑得出最快resolve的一个!

function timeout(time) {return new Promise(function (resolve) {    setTimeout(function () {        resolve(time);    }, time);});b}console.time('promise')Promise.race([    timeout(10),    timeout(60),    timeout(100)]).then(function (values) {    console.log(values); //10    console.timeEnd('promise');   // 11.280029296875ms});

Promise总结

promise then() 与 catch() 背后的意图是让你组合使用它们来正确处理异步操作的结果。此系统要优于事件与回调函数,因为它让操作是成功还是失败变得完全清晰(事件模式倾向于在出错 时不被触发,而在回调函数模式中你必须始终记得检查错误参数)

转载地址:http://iiywl.baihongyu.com/

你可能感兴趣的文章
数据结构之链表
查看>>
八年了必须放手了,我不是你妈妈
查看>>
cmd如何实现快速粘贴复制
查看>>
《Hadoop海量数据处理:技术详解与项目实战(第2版)》一1.2 Hadoop和大数据
查看>>
精通Python网络爬虫:核心技术、框架与项目实战.3.4 网页分析算法
查看>>
ROS机器人程序设计(原书第2版)2.4.6 如何使用主题与节点交互
查看>>
Eric S. Raymond 五部曲
查看>>
《Ansible权威指南 》一2.7 本章小结
查看>>
《iOS编程指南》——2.4节安装iOS SDK
查看>>
《Java 2D游戏编程入门》—— 2.3 处理鼠标输入
查看>>
Comparing Mongo DB and Couch DB
查看>>
市值登顶亚洲后,马云对话全球投资者:与未来相比阿里还是个baby
查看>>
《配置管理最佳实践》——1.6 工具的选择
查看>>
前端工程师如何快速的开发一个微信JSSDK应用
查看>>
Apache Spark源码走读(九)如何进行代码跟读&使用Intellij idea调试Spark源码
查看>>
【好书试读】数据有度:场景时代的内容玩法
查看>>
mysql 主从设计
查看>>
mybatis使用数组批量删除
查看>>
npm scripts 使用指南
查看>>
架构师速成8.1-谈做技术人员的态度
查看>>