# 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
没有合适的资源?快使用搜索试试~ 我知道了~
毕设 基于nodejs+mongoose+jquery搭建的微云网盘demo.zip
共1514个文件
js:756个
md:172个
json:154个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 35 浏览量
2023-10-24
11:27:06
上传
评论
收藏 10.78MB ZIP 举报
温馨提示
matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行!
资源推荐
资源详情
资源评论
收起资源包目录
毕设 基于nodejs+mongoose+jquery搭建的微云网盘demo.zip (1514个子文件)
WiredTigerPreplog.0000000001 100MB
WiredTigerPreplog.0000000001 100MB
WiredTigerPreplog.0000000002 100MB
WiredTigerPreplog.0000000002 100MB
WiredTigerLog.0000000005 4KB
WiredTigerLog.0000000034 90KB
metrics.2016-09-05T02-50-38Z-00000 586KB
metrics.2016-09-06T02-12-33Z-00000 518KB
metrics.2016-09-07T02-36-07Z-00000 544KB
metrics.2016-09-07T03-16-28Z-00000 18KB
metrics.2016-09-07T03-20-38Z-00000 135KB
metrics.2016-09-07T06-29-55Z-00000 7KB
metrics.2016-09-07T06-32-59Z-00000 12KB
metrics.2016-09-07T06-33-36Z-00000 13KB
metrics.2016-09-07T06-40-43Z-00000 7KB
metrics.2016-09-07T09-02-52Z-00000 7KB
metrics.2016-09-07T09-04-09Z-00000 7KB
metrics.2016-09-07T09-14-24Z-00000 7KB
metrics.2016-09-07T09-16-03Z-00000 16KB
metrics.2016-09-07T09-30-34Z-00000 7KB
metrics.2016-09-07T09-31-20Z-00000 28KB
metrics.2016-09-08T02-06-38Z-00000 7KB
metrics.2016-09-08T02-12-43Z-00000 7KB
metrics.2016-09-08T02-17-22Z-00000 13KB
metrics.2016-09-08T02-20-38Z-00000 23KB
metrics.2016-09-08T02-37-03Z-00000 245KB
metrics.2016-09-08T05-34-27Z-00000 254KB
metrics.2016-09-09T02-52-24Z-00000 43KB
metrics.2016-09-09T03-18-20Z-00000 7KB
metrics.2016-09-09T03-18-40Z-00000 7KB
metrics.2016-09-09T03-19-43Z-00000 658KB
metrics.2016-09-09T14-58-14Z-00000 8KB
metrics.2016-09-10T04-31-46Z-00000 116KB
metrics.2016-09-11T02-33-08Z-00000 468KB
metrics.2016-09-11T13-40-12Z-00000 8KB
metrics.2016-09-11T13-42-49Z-00000 174KB
metrics.2016-09-12T02-41-26Z-00000 136KB
metrics.2016-09-12T04-42-10Z-00000 197KB
metrics.2016-09-12T13-48-20Z-00000 90KB
metrics.2016-09-13T03-01-09Z-00000 189KB
metrics.2016-09-13T07-22-01Z-00000 83KB
metrics.2016-09-13T09-07-30Z-00000 449KB
metrics.2016-09-14T03-54-40Z-00000 178KB
metrics.2016-09-14T10-15-16Z-00000 45KB
metrics.2016-09-17T02-20-50Z-00000 443KB
metrics.2016-09-17T14-43-19Z-00000 458KB
range.bnf 629B
storage.bson 95B
Cakefile 624B
uglifyjs.cmd 186B
semver.cmd 176B
mkdirp.cmd 176B
swig.cmd 174B
mime.cmd 164B
ipaddr.test.coffee 16KB
ipaddr.coffee 14KB
disk.css 14KB
index.css 9KB
reset.css 471B
base.css 231B
simple_2_document_limit_toArray.dat 75KB
simple_2_document_limit_toArray.dat 75KB
preamble.error 65B
.eslintignore 24B
.eslintignore 5B
.eslintrc 477B
completion.sh.hbs 594B
part7.header 116B
part6.header 116B
part2.header 110B
part2.header 110B
preamble.header 90B
part3.header 70B
part3.header 70B
part4.header 67B
part4.header 67B
part2.header 62B
part2.header 62B
part5.header 61B
part5.header 61B
part1.header 56B
part1.header 56B
part6.header 55B
part7.header 55B
part1.header 53B
part1.header 53B
HISTORY 4KB
index.html 16KB
disk.html 8KB
props.html 2KB
weiyun.iml 458B
metrics.interim 6KB
1_1473233249624.jpg 81KB
4c3235bd1b421ece2cf9a396a22be0be_1473230356518.jpg 81KB
1_1473233518720.jpg 81KB
1_1473233473820.jpg 81KB
4c3235bd1b421ece2cf9a396a22be0be_1473230242930.jpg 81KB
1_1473233610459.jpg 81KB
1_1473236270486.jpg 81KB
1_1473233616724.jpg 81KB
共 1514 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
天天501
- 粉丝: 591
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 大学生竞赛平台源代码 springboot
- 基于VS+QT开发的FTP服务器源码+项目说明.zip
- 基于matlab实现心电信号预处理 滤波 去噪 QRs波检测 P波,T波检测.rar
- 华为 OD 机考攻略-加强版
- 基于matlab实现烟花算法程序大全.rar
- limbox86pcemulator_241983-3.apk
- 基于matlab实现烟花算法进行函数最小-最大值寻优,对十多个测试函数进行了寻优,效果良好,代码附带详细说明.rar
- 基于matlab实现样本熵算法,可用于提取生理信号的特征参数
- 基于matlab实现增强型烟花算法!文章最初由杜振鑫发表,后来北大博士重新修改后发表,这是源代码.rar
- 5G网优案例:传输IPV6分片报文Reserved字段校验不通过导致VONR呼叫失败.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功