nodejs异步调用async

犹豫nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦,async的流程控制就是为了简化这些操作var async = require(‘async‘);

1、series(多个函数一次执行,之间没有数据交换)series(tasks,[callback])顺序执行数组、集合内的函数,当前面一个函数执行完成就会立即执行下一个函数,如果函数触发了错误,可以在callback函数中验证,否则会一直执行完成tasks有多个异步函数需要依次调用,一个完成之后才能执行下一个,各函数之间没有数据的交换,仅仅需要保证其执行顺序,这时可以使用series。tasks传的是一个数组函数
const async=require(‘async‘);async.series([    function(callback){        console.log("one");        callback(null,"one");    },    function(callback){        console.log("two");        callback(null,"two");    }],function(err,results){    console.log("err======"+err);    console.log("results======"+results);    console.log("typeof results======"+typeof (results));})

运行之后输出:

one
two
err======null
results======one,two
typeof results======object

我觉得这里很重要的是err是上面两个函数的错误信息,而results这个参数是一个数组对象,他们的值是上面数组函数每个callback里面的参数以上代码详解:  1、依次执行一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。  2、如果任何一个函数向它的回调函数中传了一个error,则后面的函数都不会被执行,并且将会立刻将该error以及已经执行了的函数的结果传给series中最后的那个callback  3、当所有的函数执行完后(没有出错),则会把每个函数传给其回调函数的结果合并为一个数组,传递给series最后的那个callback。  4、还可以json的形式来提供tasks。每个属性都会被当作函数来执行,并且结果也会以json形式传给series最后那个callback,这种方式可读性更高一些。  5、如果中间某个函数出错,series函数如何处理:中间有函数出错。出错之后的函数不会执行,错误及之前正常执行的函数结果将传给最终的callback。  6、如果某个函数传给回调的值是undefined,null,{},[]等,series如何处理:如果某个函数传的数据是undefined, null, {}, []等,它们会原样传给最终callback。  7、另外还需要注意的是:多个series调用之间是不分先后的,因为series本身也是异步调用。模拟series多个函数中一个出错会如何
const async=require(‘async‘);async.series([    function(callback){        console.log("one");        callback("error","one");    },    function(callback){        console.log("two");        callback(null,"two");    }],function(err,results){    console.log("err======"+err);    console.log("results======"+results);    console.log("typeof results======"+typeof (results));})运行后输出:

  one
  err======error
  results======one
  typeof results======object

传json形式tasks

代码:

const async=require("async");

async.series({    one:function(callback){        setTimeout(function(){            callback(null,1);        },200)    },    two:function(callback){        setTimeout(function(){            callback(null,2);        })    }},function(err,results){    console.log("results0====="+results[‘one‘]);    console.log("results1====="+results[‘two‘]);})运行后输出:

  results0=====1
  results1=====2

这是一个json格式的results

2、parallel

  parallel(tasks,[callback])并行执行数组集合内的方法,不用等到前一个函数执行完再执行下一个函数,如果函数促发了错误,可以再callback函数中验证

  并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。  

  如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback。其它未执行完的函数的值不会传到最终数据,但要占个位置。

  同时支持json形式的tasks,其最终callback的结果也为json形式。

const async=require(‘async‘);

async.parallel([    function(callback){        setTimeout(function(){            callback(null,"one");        },200)    },    function(callback){        setTimeout(function(){            callback(null,"two");        },100);    }],function(err,results){    console.log("err====="+err);    console.log("results====="+results);})运行后输出:

err=====null
results=====one,two

代码:

const async=require(‘async‘);

async.parallel([        function(callback){            setTimeout(function(){                callback(null,"one");            },400)        },        function(callback){            setTimeout(function(){                callback("err","two");            },200);        },        function(callback){            setTimeout(function(){                callback(null,"three");            },100);        }    ],    function(err,results){        console.log("err====="+err);        console.log("results====="+results);    })运行后输出:

err=====err
results=====,two,three

代码:

const async=require(‘async‘);

async.parallel({        one:function(callback){            setTimeout(function(){                callback(null,"one");            },400)        },        two:function(callback){            setTimeout(function(){                callback(null,"two");            },200);        },        three:function(callback){            setTimeout(function(){                callback(null,"three");            },100);        }},    function(err,results){        console.log("err====="+err);        console.log("results====="+results[‘one‘]);        console.log("results====="+results[‘two‘]);        console.log("results====="+results[‘three‘]);    })运行后输出:

err=====null
results=====one
results=====two
results=====three

3、waterfall

waterfall(tasks,callback),多个函数依次执行,且前一个的输出为吼一个的输入,

与series相似,按顺序依次执行多个函数,不同之处是,每个函数产生的值,都将传给下一个函数,如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback;该函数不支持json格式的tasks,

* 注意,所有的callback都必须形如callback(err, result),但err参数在前面各函数中无需声明,它被自动处理。

中途有函数出错,其err和产生的值将直接传给最终callback,后面的函数不再执行

代码:

const async=require(‘async‘);async.waterfall([    function(callback){        callback(null,‘one‘,‘two‘);    },function(args,arg2,callback){        callback(null,‘three‘);    },function(arg1,callback){        callback(null,‘done‘);    }],function(err,results){    console.log("results====="+results);})运行后输出:results=====done代码:
const async=require(‘async‘);async.waterfall([    function(callback){        callback(null,‘one‘,‘two‘);    },function(args,arg2,callback){        callback("err",‘three‘);    },function(arg1,callback){        callback(null,‘done‘);    }],function(err,results){    console.log("results====="+results);})运行后输出:

results=====three

4、whilst

whilst(test,fn,callback),可用于异步调用的while,第一个参数为验证条件,第二个参数为执行函数,第三个参数为验证失败后回调函数,一般在延迟动画用的比较多

相当于while,但其中的异步调用将在完成后才会惊醒下一次循环,

代码:

const async=require(‘async‘);var count=0;async.whilst(    function(){   //验证成功继续,失败回调        return count<5;    },    function(callback){   //1秒过去该函数回调执行完毕,接着循环,知道count=5的时候,第一个方法过不去了,报错,走到第三个方法        console.log("count"+count);        count++;        setTimeout(callback,1000);    },    function(err){        console.log("err"+err);    })代码运行后输出:

count0
count1
count2
count3
count4
errnull

该函数的功能比较简单,条件变量通常定义在外面,可供每个函数访问,在循环中,异步调用时产生的值实际上被丢弃了,因为最后那个callback只能传入错误信息。

另外,第二个函数fn需要能接受一个函数cb,这个cd最终必须被执行,用于表示出错或正常结束

中途出错。出错后立刻调用第三个函数。

代码:

const async=require(‘async‘);var count=0;async.whilst(    function(){   //验证成功继续,失败回调        return count<5;    },    function(callback){   //5秒过去后        console.log("count"+count);        count++;        if(count===1){            callback("err");        }else{            setTimeout(callback,1000);        }    },    function(err){        console.log("err"+err);    })运行后输出:

count0
errerr

第二个函数即使产生值,也会被忽略。第三个函数只能得到err。


				
时间: 2024-08-30 11:42:36

nodejs异步调用async的相关文章

170719、springboot编程之异步调用@Async

1.在pom.xml中增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 2.在主类上开启注解 package com.rick; import org.springframework.boot.SpringApplication; imp

springboot 异步调用Async使用方法

引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将介绍在springboot中如何使用@Async. 1.pom.xml中导入必要的依赖: <parent> <groupId>org.springframework.boot</groupId> <artifa

SpringBoot系列:Spring Boot异步调用@Async

在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程.定时任务.消息队列等, 这一章节,我们就来讲讲@Async异步方法调用. 一.@Async使用演示 @Async是Spring内置注解,用来处理异步任务,在SpringBoot中同样适用,且在SpringBoot项目中,除了boot本身的starter外,不需要额外引入依赖. 而要使用@Async,需要在启动类上加上@EnableAsync主动声明来开启异

异步调用 async

基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小. 在 consumer.xml 中配置: <dubbo:reference id="fooService" interface="com.alibaba.foo.FooService"> <dubbo:method name="findFoo" async="true" /> </dubbo

浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法(转载)

在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如: 复制代码 代码如下: function ManageCommentText(text) {var result = text;$.ajax({data: "get",url: "GetComments.aspx",data: "typ

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如: function ManageCommentText(text) { var result = text; $.ajax({ data: "get", url: &qu

SpringBoot中异步请求和异步调用(看这一篇就够了)

一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求

Nodejs - 框架类库 - Nodejs异步流程控制Async

简介 Async是一个流程控制工具包,提供了直接而强大的异步功能 应用场景 业务流程逻辑复杂,适应异步编程,减少回调的嵌套 安装 npm insatll async 函数介绍 Collections each: 如果想对同一个集合中的所有元素都执行同一个异步操作. 1 var async = require('async'); 2 3 var t = require('./t'); 4 var log = t.log; 5 6 /** 7 * 8 * async提供了三种方式: 9 * 1. 集

spring-boot实战【10】【转】:Spring Boot中使用@Async实现异步调用

什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序. 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16