# Async.js
[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)
[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async)
[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master)
[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Async is a utility module which provides straight-forward, powerful functions
for working with asynchronous JavaScript. Although originally designed for
use with [Node.js](http://nodejs.org) and installable via `npm install async`,
it can also be used directly in the browser.
Async is also installable via:
- [bower](http://bower.io/): `bower install async`
- [component](https://github.com/component/component): `component install
caolan/async`
- [jam](http://jamjs.org/): `jam install async`
- [spm](http://spmjs.io/): `spm install async`
Async provides around 20 functions that include the usual 'functional'
suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these
functions assume you follow the Node.js convention of providing a single
callback as the last argument of your `async` function.
## Quick Examples
```javascript
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter(['file1','file2','file3'], fs.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
```
There are many more functions available so take a look at the docs below for a
full list. This module aims to be comprehensive, so if you feel anything is
missing please create a GitHub issue for it.
## Common Pitfalls <sub>[(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js)</sub>
### Synchronous iteration functions
If you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator. By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers. Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.setImmediate` to start a new call stack on the next tick of the event loop.
This can also arise by accident if you callback early in certain cases:
```js
async.eachSeries(hugeArray, function iterator(item, callback) {
if (inCache(item)) {
callback(null, cache[item]); // if many items are cached, you'll overflow
} else {
doSomeIO(item, callback);
}
}, function done() {
//...
});
```
Just change it to:
```js
async.eachSeries(hugeArray, function iterator(item, callback) {
if (inCache(item)) {
async.setImmediate(function () {
callback(null, cache[item]);
});
} else {
doSomeIO(item, callback);
//...
```
Async guards against synchronous functions in some, but not all, cases. If you are still running into stack overflows, you can defer as suggested above, or wrap functions with [`async.ensureAsync`](#ensureAsync) Functions that are asynchronous by their nature do not have this problem and don't need the extra callback deferral.
If JavaScript's event loop is still a bit nebulous, check out [this article](http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/) or [this talk](http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html) for more detailed information about how it works.
### Multiple callbacks
Make sure to always `return` when calling a callback early, otherwise you will cause multiple callbacks and unpredictable behavior in many cases.
```js
async.waterfall([
function (callback) {
getSomething(options, function (err, result) {
if (err) {
callback(new Error("failed getting something:" + err.message));
// we should return here
}
// since we did not return, this callback still will be called and
// `processData` will be called twice
callback(null, result);
});
},
processData
], done)
```
It is always good practice to `return callback(err, result)` whenever a callback call is not the last statement of a function.
### Binding a context to an iterator
This section is really about `bind`, not about `async`. If you are wondering how to
make `async` execute your iterators in a given context, or are confused as to why
a method of another library isn't working as an iterator, study this example:
```js
// Here is a simple object with an (unnecessarily roundabout) squaring method
var AsyncSquaringLibrary = {
squareExponent: 2,
square: function(number, callback){
var result = Math.pow(number, this.squareExponent);
setTimeout(function(){
callback(null, result);
}, 200);
}
};
async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){
// result is [NaN, NaN, NaN]
// This fails because the `this.squareExponent` expression in the square
// function is not evaluated in the context of AsyncSquaringLibrary, and is
// therefore undefined.
});
async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){
// result is [1, 4, 9]
// With the help of bind we can attach a context to the iterator before
// passing it to async. Now the square function will be executed in its
// 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`
// will be as expected.
});
```
## Download
The source is available for download from
[GitHub](https://github.com/caolan/async/blob/master/lib/async.js).
Alternatively, you can install using Node Package Manager (`npm`):
npm install async
As well as using Bower:
bower install async
__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed
## In the Browser
So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5.
Usage:
```html
<script type="text/javascript" src="async.js"></script>
<script type="text/javascript">
async.map(data, asyncProcess, function(err, results){
alert(results);
});
</script>
```
## Documentation
Some functions are also available in the following forms:
* `<name>Series` - the same as `<name>` but runs only a single async operation at a time
* `<name>Limit` - the same as `<name>` but runs a maximum of `limit` async operations at a time
### Collections
* [`each`](#each), `eachSeries`, `eachLimit`
* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit`
* [`map`](#map), `mapSeries`, `mapLimit`
* [`filter`](#filter), `filterSeries`, `filterLimit`
* [`reject`](#reject), `rejectSeries`, `rejectLimit`
* [`reduce`](#reduce), [`reduceRight`](#reduceRight)
* [`detect`](#detect), `detectSeries`, `detectLimit`
* [`sortBy`](#sortBy)
* [`some`](#some), `someLimit`
* [`every`](#every), `everyLimit`
* [`concat`](#concat), `concatSeries`
### Control Flow
* [`series`](#seriestasks-callback)
* [`parallel`](#parallel), `parallelLimit`
* [`whilst`](#whilst), [`doWhilst`](#doWhilst)
* [`until`](#until), [`doUntil`](#doUntil)
* [`during`](#during), [`doDuring`](#doDuring)
* [`forever`](#forever)
* [`waterfall`](#waterfall)
* [`compose`](#compose)
* [`seq`](#seq)
* [`applyEach`](#applyEach), `applyEachSeries`
* [`queue`](#queue), [`priorityQueue`](#priorityQueue)
* [`cargo`](#cargo)
* [`auto`](#auto)
* [`retry`](#retry)
* [`iterator`](#iterator)
* [`times`](#times), `timesSeri
没有合适的资源?快使用搜索试试~ 我知道了~
node-v4.8.5.tar.gz
0 下载量 77 浏览量
2024-04-19
15:55:55
上传
评论
收藏 21.72MB GZ 举报
温馨提示
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
资源推荐
资源详情
资源评论
收起资源包目录
node-v4.8.5.tar.gz (2000个子文件)
ecp_nistz256_table.c 603KB
ares_platform.c 481KB
t1_lib.c 145KB
ec_curve.c 136KB
s3_clnt.c 126KB
s3_srvr.c 123KB
s_server.c 114KB
test.c 110KB
s3_lib.c 106KB
ssltest.c 104KB
ssl_lib.c 104KB
ca.c 93KB
speed.c 91KB
apps.c 89KB
s_client.c 79KB
x509_vfy.c 78KB
deflate.c 77KB
kssl.c 75KB
ecp_nistp256.c 74KB
gcm128.c 72KB
e_aes.c 71KB
ecp_nistp521.c 70KB
http_parser.c 70KB
ssl_ciph.c 68KB
tty.c 67KB
d1_pkt.c 65KB
fs.c 63KB
ecp_nistp224.c 62KB
bss_dgram.c 62KB
aes_core.c 61KB
pipe.c 61KB
ectest.c 59KB
s3_pkt.c 59KB
bntest.c 55KB
e_capi.c 55KB
req.c 55KB
str_lib.c 54KB
inflate.c 54KB
ares_init.c 53KB
d1_both.c 52KB
ecp_nistz256.c 52KB
hw_zencod.c 51KB
s_cb.c 49KB
bn_exp.c 48KB
cms.c 47KB
t1_enc.c 47KB
ssl_err.c 44KB
ocsp.c 44KB
tcp.c 44KB
x509.c 43KB
tunala.c 43KB
trees.c 43KB
e_chil.c 43KB
v3_addr.c 42KB
ssl_sess.c 42KB
t1_trce.c 42KB
stream.c 41KB
eng_cryptodev.c 41KB
seed.c 41KB
ares_process.c 41KB
gzlog.c 41KB
s2_srvr.c 40KB
aes_x86core.c 40KB
ec_asn1.c 40KB
tasn_dec.c 39KB
bn_nist.c 39KB
ecp_smpl.c 39KB
v3_utl.c 38KB
pk7_doit.c 38KB
e_sureware.c 38KB
e_padlock.c 38KB
util.c 37KB
easy-tls.c 37KB
ssl_cert.c 36KB
s2_clnt.c 36KB
pkcs12.c 36KB
mttest.c 35KB
e_cswift.c 35KB
destest.c 34KB
bn_gf2m.c 34KB
ts.c 34KB
process.c 34KB
d1_srvr.c 34KB
wp_block.c 34KB
fs.c 34KB
e_ubsec.c 34KB
s3_enc.c 33KB
e_aes_cbc_hmac_sha1.c 33KB
bn_mul.c 33KB
err.c 33KB
e_aes_cbc_hmac_sha256.c 33KB
ts_rsp_sign.c 32KB
e_aep.c 32KB
cryptlib.c 32KB
ec_lib.c 31KB
ssl_rsa.c 31KB
s3_cbc.c 30KB
ssl_stat.c 30KB
bn_asm.c 30KB
e_4758cca.c 30KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
程序员Chino的日记
- 粉丝: 3719
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- bcprov-jdk15on-1.50.zi
- (7151648)记事本源代码
- 深入探讨HTTP协议的核心功能及其安全性解决方案
- 用digital实现D触发器
- 视频游戏检测30-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- 皮带滚筒式双向移载机sw12可编辑全套技术资料100%好用.zip
- fdjslkfjkldsjgkklfdg
- EMC整改过程分享+EMC测试项+EMC优化方案+EMC验证结果
- 瓶盖打码分拣机sw18可编辑全套技术资料100%好用.zip
- 牛奶激光打码夹持自动化设备sw18可编辑全套技术资料100%好用.zip
- 机器故障数据集.zip
- windows组策略组策略分享
- 气动真空上料机sw17全套技术资料100%好用.zip
- 谷物盒、牛奶纸箱、苏打水检测14-YOLO(v5至v11)、COCO、Paligemma数据集合集.rar
- proxy arp自动配置-打开-适用于openwrt
- 基于粒子群算法的配电网重构 基于IEEE33节点电网,以网损和电压偏差最小为目标,考虑系统的潮流约束,采用粒子群算法求解优化模型,得到确保放射型网架的配电网重构方案 这个程序主要是一个潮流计算程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功