首页 > 其他分享 >异步

异步

时间:2023-07-01 13:12:38浏览次数:48  
标签:function 异步 resolve 函数 Promise async

Promise

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

  • promise对象的状态不受外界的影响.有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。

基本用法

const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

例子:

异步加载图片

function loadImageAsync(url) {
  return new Promise(function(resolve, reject) {
    const image = new Image();
    image.onload = function() {
      resolve(image);
    };
    image.onerror = function() {
      reject(new Error('Could not load image at ' + url));
    };
    image.src = url;
  });
}

Promise.prototype.then()

Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。

then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

async

async 函数是什么?一句话,它就是 Generator 函数的语法糖。

基本用法

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

例子:

async function getStockPriceByName(name) {
  const symbol = await getStockSymbol(name);
  const stockPrice = await getStockPrice(symbol);
  return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
  console.log(result);
});
function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}
asyncPrint('hello world', 50);

上面代码指定 50 毫秒以后,输出hello world

由于async函数返回的是 Promise 对象,可以作为await命令的参数。所以,上面的例子也可以写成下面的形式。

async function timeout(ms) {
  await new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}


async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}


asyncPrint('hello world', 50);

标签:function,异步,resolve,函数,Promise,async
From: https://www.cnblogs.com/oOLzYOo/p/17519145.html

相关文章

  • 双写一致性之定时更新、异步发送短信、异步秒杀逻辑前后端、课程页页面前端、课程相关
    目录一、双写一致性之定时更新任务逻辑二、异步发送短信视图函数任务三、异步秒杀逻辑前后端1.1前端Sckill.vue视图类路由任务四、课程相关表分析先创建一个course.app表数据迁移表六、课程表数据录入七、课程主页接口一、双写一致性之定时更新任务逻辑@app.taskdefupdate......
  • 感应电机 异步电机定子匝间短路仿真 matlab simulink
    感应电机异步电机定子匝间短路仿真matlabsimulink我将重新表述关于感应电机和异步电机定子匝间短路仿真的内容。感应电机是一种常见的电动机类型,它通过感应原理工作。异步电机是感应电机的一种特殊类型,其定子匝间短路是指在定子绕组中存在短路现象。仿真是使用计算机模型来模拟......
  • celery 之 celery介绍架构和安装、celery执行异步任务、包结构celery、celery执行
    目录一、celery介绍架构和安装1、celery:分布式的异步任务框架,主要用来做:2、celery框架,原理3、celery架构4、安装celery5、celery不支持win,所以想再win上运行,需要额外安装eventlet二、celery执行异步任务基本使用1再虚拟环境中装celery和eventlet2写个py文件,实例化得到app对象......
  • 11celery介绍架构和安装,celery执行异步任务,包结构celery,celery执行延迟任务和定时任务
    1celery介绍架构和安装#celery:分布式的异步任务框架,主要用来做: -异步任务-延迟任务-定时任务---》如果只想做定时任务,可以不使用celery,有别的选择#celery框架,原理1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)2)celery服务为为其他项目......
  • 在 Java、Python、JavaScript 和 Go 中拥抱异步
    ​本文讨论了四种语言的异步,强调了它在创建高效、响应迅速的应用程序中的作用。作为一名拥有多年主要使用Java工作经验的软件开发人员,当我最近为一个新项目切换到Python时,我发现自己很感兴趣。这种转变促使我探索各种语言的异步编程世界,包括Java、Python、JavaScript和Go......
  • java 异步方法总结(减少主线程阻塞)
    主要点第一点:@Async只能使用到被代理的对象方法上,即代理类的入口方法处,且方法必须是public的。第二点:事务处理机制使用@Async异步注解不能和@Transaction事务注解在同一个方法上同时使用,不然事务注解将无效。要使用事务,需要把事务注解提取到方法里面的子方法上。  代码实......
  • 谷粒商城项目篇10_分布式高级篇_ES首页检索功能、异步、商品详情
    目录首页检索功能异步商品详情一、首页检索功能1.环境准备配置本地域名解析配置nginx将请求转给网关http{includemime.types;default_typeapplication/octet-stream;sendfileon;keepalive_timeout65; #配置上游服务器(网关) u......
  • spring mvc 和ajax异步交互完整实例
    spring MVC异步交互demo:1.jsp页面: 1.<%@pagelanguage="java"contentType="text/html;charset=utf-8"2."utf-8"%>3.<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/......
  • JS异步编程
    ES5中的Generator异步方案Generator使用function*foo(){console.log('start')try{constres=yield'foo'console.log(res)//bar}catch(e){console.log(e)}}constgenerator=foo()constres=generator.next()con......
  • 线程池处理异步任务
    点击查看代码/***异步任务线程池(单例)*用于异步执行任务*/publicclassThreadPoolSingleton{privatestaticfinalAtomicReference<ThreadPoolSingleton>INSTANCE=newAtomicReference<>();privatefinalExecutorServiceexecutor;privateTh......