资讯专栏INFORMATION COLUMN

「 JS 」快速上手异步方案

pinecone / 3366人阅读

摘要:构造函数回调函数是同步的回调异步操作的实例对象有三个状态初始状态,既不是成功,也不是失败状态。如果中的回调函数抛出一个错误,那么返回的将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。

问题:解决异步回调的深层嵌套的问题.(回调地狱)
1. Promise

promise对象用于表示一个异步操作的最终状态,promise在回调代码和将要执行这个任务的异步代码之间提供了一种可靠的中间机制来管理回调。

//构造函数,回调函数是同步的回调
new Promise(function(resolve,reject){
    ....//异步操作
})

Promise的实例对象有三个状态

 pending: 初始状态,既不是成功,也不是失败状态。

fulfilled: 意味着操作成功完成。

rejected: 意味着操作失败

resolve和reject分别是两个函数,当在回调中调用时,会改变promise实例的状态,resolve改变状态为成功,reject为失败.

then

Promise.prototype.then()

当promise对象的状态发生改变时,绑定在其身上的then方法就会被调用。
then方法包含两个参数:onfulfilled函数 和 onrejected函数,它们都是 Function
类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争,then() 方法返回一个 Promise对象.

返回值

then方法返回一个新的Promise,而它的行为与then中的回调函数的返回值有关:

如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。

如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。

如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。

如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。

如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。

catch

catch() 方法返回一个Promise,并且处理拒绝的情况。

Promise.prototype.catch()

事实上,catch方法相当于then方法的第二个参数方法,触发拒绝状态.

注意,
如果调用 then的 Promise 的状态(fulfillment 或 rejection)发生改变,但是 then 中并没有关于这种状态的回调函数,那么 then 将创建一个没有经过回调函数处理的新 Promise 对象,这个新 Promise 只是简单地接受调用这个 then 的原 Promise 的终态作为它的终态。所以在链式上,最终会执行到catch上.

//链式示例
new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("1");
resolve();
}, 1000);
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("2");
// resolve();
reject();
}, 1000);
});
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("3");
resolve();
}, 1000);
});
}).then(function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("4");
resolve();
}, 1000);
});
}).catch(function(){
console.log("catch");
})
2. genarator

symbol

新的一种基础数据类型symbol,表示独一无二的值.
它通常作为对象的属性键,内置对象普遍存在该值.

// 一般用法,它并不是构造器,不能通过new,会报错.
let sym = Symbol();

// 在对象中表现形式,要用[]包裹,不然会被认为是string.
var obj = {
    [Symbol()]:"value";
}

该属性是匿名,所以不可枚举,只能通过.getOwnPropertySymbols()返回的数组.

// 想要获得两个相同的Symbol,得通过.for()

Symbol("asd") === Symbol("asd") // false
Symbol.for("asd") === Symbol.for("asd")  // true

Iterator

迭代器,存在于特定几种可枚举的数据类型中.

// 一般用以下这种形式的键保存了迭代器函数.
// arr[Symbol.iterator]

aarr[Symbol.iterator]( ).next( )  //遍历下一个,返回value和done,value表示值,done表示是否可以继续遍历下一个.

//for...of循环遍历就是基于此,必须该数据类型有迭代器.

回到generator

//表现形式
function* test(){
   
   yield 1; //任务1
   
   yield 2; //任务2
  
   yield 3;  //任务3
  
   yield 4 ; //任务4
}
//  调用该方法会返回一个含有迭代对象的对象.
var obj = text();
obj.next();   //调用该方法时,每次到一个yield处停止.
3. async/await

作用:

简化promise的使用编码, 不通过then()/catch()来指定回调函数

以同步编码方式实现异步流程

async function test (){

    //  等待状态改变,自动执行到下一个wait处
 var flag =  await  new Promise((resolve,reject)=>{
    
            setTimeout(function(){
            
            // 状态改变
            resolve(data); //这里面的值传递给flag
            },1000)
   })
   //通过flag传递数据
 flag =  await  new Promise((resolve,reject)=>{
    
            setTimeout(function(flag){
            
            // 状态改变
            resolve(flag);
            },1000,flag)
   })
}

test().catch(function(err){
        //处理异常
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103667.html

相关文章

  • 珠峰前端架构师培养计划

    摘要:公司的招聘要求都提到了至少熟悉其中一种前端框架,有前端工程化与模块化开发实践经验相关字眼。我们主要从端公众号移动端小程序三大平台进行前端的技术选型,并来说说选其技术的几大优势。技术的优势互联网前端大潮后,前端出现了大框架,分别是与。 1、技术选型的背景前端技术发展日新月异,互联网上出现的新型框架也比较多,如何让新招聘的人员...

    ccj659 评论0 收藏0
  • H5学习

    摘要:为此决定自研一个富文本编辑器。本文,主要介绍如何实现富文本编辑器,和解决一些不同浏览器和设备之间的。 对ES6Generator函数的理解 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 JavaScript 设计模式 ② 巧用工厂模式和创建者模式 我为什么把他们两个放在一起讲?我觉得这两个设计模式有相似之处,有时候会一个设计模式不能满...

    aristark 评论0 收藏0
  • Swoole难上手?从EasySwoole开始

    摘要:组件提供了很多实用的组件包括控制台组件定时器触发器日志处理等等致谢从下一章开始,我们逐步使用的各项功能并开发一个简单的并发版爬虫系统,感谢你看到这里,希望本文可以帮到你,谢谢 showImg(https://segmentfault.com/img/bVbpts4?w=640&h=160); 前言 我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。https:...

    lavor 评论0 收藏0
  • Pastate.js : 响应式 react state 管理框架

    摘要:简介是什么是一个响应式管理框架,实现了对的异步响应式管理。可靠性已经通过个测试用例的全面测试,稳定可靠。安装是一个状态管理框架,需要配合使用。 Pastate 简介 Pastate 是什么 Pastate 是一个响应式 react state 管理框架,实现了对 state 的异步响应式管理。Pastate 是一个精益框架,它对很多高级概念进行了友好封装,这意味着你不必学习一些难以理解...

    jonh_felix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<