js有哪些异步操作_js单线程怎么实现异步

js有哪些异步操作_js单线程怎么实现异步JS常用的几种异步流程控制

大家好,又见面了,我是你们的朋友全栈君。

JavaScript引擎是基于单线程 (Single-threaded) 事件循环的概念构建的,同一时刻只允许一个代码块在执行,所以需要跟踪即将运行的代码,那些代码被放在一个任务队列 (job queue) 中,每当一段代码准备执行时,都会被添加到任务队列中。每当JavaScript引擎中的一段代码结束执行,时间循环 (event loop) 会执行队列中的下一个任务,它是 JavaScript 引擎中的一段程序,负责监控代码执行并管理任务队列。

请记住,队列中的任务会从第一个一直执行到最后一个。

事件模型

JavaScript最基础的异步编程形式(比如点击事件、键盘事件)
直到事件触发时才执行处理程序

回调模式

回调模式与事件模型类似,异步代码都会在未来的某个时间点执行,而这的区别是回调模式中被调用的函数是作为参数传入的。
Node.js读取磁盘上的文件:

readFile('example.txt', function(err, contents) {
  if(err) {
    throw err
  }
  
  console.log(contents)
})

console.log('Hi!')

调用readFile函数后,console.log(‘Hi!’)语句会立即执行,当readFile结束执行的时候,会向任务队列的末尾添加一个新任务,该任务包含回调函数及相应的参数。

虽然这个模式运行效果很不错,但是如果嵌套了太多的回调函数,就会陷入回调地狱。

当需要跟踪多个回调函数的时候,回调函数的局限性就体现出来了,Promise非常好的改进了这些情况。

Promise

Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象

一个 Promise有以下几种状态:

pending: 初始状态,既不是成功,也不是失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。

pending 状态的 Promise 对象可能触发fulfilled 状态并传递一个值给相应的状态处理方法,也可能触发失败状态(rejected)并传递失败信息。当其中任一种情况出现时,Promise 对象的 then 方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。

因为 Promise.prototype.then 和 Promise.prototype.catch 方法返回promise 对象, 所以它们可以被链式调用。

var promise1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

promise1.then(function(value) {
  console.log(value);
  // expected output: "foo"
});

console.log(promise1);
// expected output: [object Promise]

async/await

当调用一个 async 函数时,会返回一个 Promise 对象。当这个 async 函数返回一个值时,Promise 的 resolve 方法会负责传递这个值;当 async 函数抛出异常时,Promise 的 reject 方法也会传递这个异常值。

async 函数中可能会有 await 表达式,这会使 async 函数暂停执行,等待 Promise 的结果出来,然后恢复async函数的执行并返回解析值(resolved)。

注意, await 关键字仅仅在 async function中有效。如果在 async function函数体外使用 await ,你只会得到一个语法错误(SyntaxError)。

async function testAsync() {
    return "Hello";
}

const testResult = testAsync();
console.log(testResult); //Promise { 'Hello' }

testAsync().then(v => {
    console.log(v);    // 输出 Hello
});

//使用await
async function testAsnync1() {
    let result = await testAsync();
    console.log(result); // Hello
}

参考

Promise() | MDN
《深入理解ES6》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106980.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis如何设置密码及验证密码_redis设置永不过期

    redis如何设置密码及验证密码_redis设置永不过期密码设置这里简单介绍一下redis如何设置密码redis密码设置有两种方式,一种需要重启redis服务,一种不需要重启redis服务。首先,介绍一下需要重启redis服务的设置方式即找到redis的配置文件—redis.conf文件,然后修改里面的requirepass,这个本来是注释起来了的,将注释去掉,并将后面对应的字段设置成自己想要的密码,保存退出。重启redis服务,即可。我…

    2022年4月19日
    76
  • jenkins+SVN配置「建议收藏」

    jenkins+SVN配置「建议收藏」开发项目,版本控制必不可少,我用的版本控制软件为SVN,那么如何把jenkins和SVN结合,使得SVN源码一有上传更新,jenkins就马上构建项目呢?下面说一下配置过程1)首先要在jenkins中添加svn的用户名和密码:打开“Credentials”界面进行添加,如下图2)配置项目工作空间3)配置项目:源码管理选择SVN,如下图:4)配置项目:设置构建触发器…

    2022年9月12日
    0
  • redis主从复制和集群的区别_redis主从复制和redis集群的区别

    redis主从复制和集群的区别_redis主从复制和redis集群的区别Redis主从复制和集群配置    redis主从复制概述1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。2、

    2022年8月13日
    2
  • 历年数学界菲尔兹奖及其得主简介

    历年数学界菲尔兹奖及其得主简介菲尔兹奖及其得主简介菲尔兹奖是以已故的加拿大数学家、教育家J.C.菲尔兹(FieldS)的姓氏命名的。J.C.菲尔兹1863年5月14日生于加拿大渥太华。他11岁丧父、18岁丧母,家境不算太好,J.C.菲尔兹17岁进入多伦多大学攻读数学,24岁时在美国的约翰·霍普金斯大学获博士学位,26岁任美国阿格尼大学教授。1892年到巴黎、柏林学习和工作。1902年回国后执教于多伦多大学。1907年

    2022年5月16日
    157
  • Lamp架构_公司网络架构与配置

    Lamp架构_公司网络架构与配置1.LAMP简介与概述1.1LAMP平台概述LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整台系统和相关软件,能够提供动态web站点服务及其应用开发环境LAMP是一个缩写词,具体包括Linux操作系统,Apache网站服务器,MySQL数据库服务器,PHP(或perl,Python)网页编程语言1.2LAMP各组件作用(平台)Linux:作为LAMP架构的基础,提供用于支撑Web站点的操作系统,能够与其他三个组件提供更好的稳定性,兼容性(AMP组件也支持Wind..

    2022年10月17日
    0
  • 给力者基于51单片机的C语言教程,给力者单片机开发教程

    给力者基于51单片机的C语言教程,给力者单片机开发教程资源介绍给力者单片机开发教程给力者51单片机视频教程01:51单片机学前的准备工作1.mp4给力者51单片机视频教程01:51单片机学前的准备工作2.mp4给力者51单片机视频教程02:51单片机的C语言程序框架.mp4给力者51单片机视频教程03:51单片机的数字量输出1.mp4给力者51单片机视频教程03:51单片机的数字量输出2.mp4给力者51单片机视频教程04:51单片机的查表操作1.m…

    2022年6月7日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号