# 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
没有合适的资源?快使用搜索试试~ 我知道了~
Cesium:基于Cesium的古村镇三维展示系统
共6368个文件
js:2923个
json:958个
md:833个
4星 · 超过85%的资源 需积分: 45 104 下载量 132 浏览量
2021-03-11
17:34:48
上传
评论 12
收藏 15.11MB ZIP 举报
温馨提示
基于Cesium的古村镇三维展示 由于Cesium框架本质上是JavaScript库,所以要在本地运行Cesium首先需要部署运行环境。 Cesium官方推荐的服务环境是Node.js部署的,所以首先需下载Node.js 下载地址: : 下载完后直接安装,安装过程比较简单,就接下来下一步就行 该系统已经npm所需的组件,就不需要再用Node.js npm install了,不过需要注意的是我上传的文件有两个压缩包,需要解压。安装好Node.js后,切换到 本文件夹根目 录下,双击startCesium.bat文件即可部署运行环境。该系统本地本地端口为8080,所以在浏览器中直接输 入localhost:8080即可 该系统参考了“富士山“动物交通事故死”マップ”的项目,在此基础上做了修改,添加了百度街景。 百度街景需要秘钥,可以自己去百度开发者中去申请 由于开发的时间比较久了。现在A
资源详情
资源评论
资源推荐
收起资源包目录
Cesium:基于Cesium的古村镇三维展示系统 (6368个子文件)
almond.0 2KB
sshpk-conv.1 4KB
sshpk-sign.1 2KB
sshpk-verify.1 2KB
marked.1 2KB
almond.1 558B
address 673B
LICENSE.APACHE2 586B
LICENSE.APACHE2 586B
apply 179B
AUTHORS 217B
AUTHORS 217B
AUTHORS 151B
AUTHORS 151B
AUTHORS 151B
bash 734B
startCesium.bat 20B
.baz 19B
.baz 0B
range.bnf 623B
range.bnf 623B
build 1KB
benchmark-native.c 613B
Cakefile 624B
calendar 945B
card 2KB
CHANGELOG 3KB
CHANGELOG 2KB
CHANGELOG 896B
changelog 882B
har-validator.cmd 204B
strip-json-comments.cmd 194B
strip-json-comments.cmd 194B
esvalidate.cmd 190B
sshpk-verify.cmd 186B
esparse.cmd 184B
dateformat.cmd 184B
dateformat.cmd 184B
dateformat.cmd 184B
sshpk-sign.cmd 182B
sshpk-conv.cmd 182B
strip-indent.cmd 180B
strip-indent.cmd 180B
strip-indent.cmd 180B
r.js.cmd 178B
uuid.cmd 178B
window-size.cmd 178B
marked.cmd 176B
jshint.cmd 176B
mkdirp.cmd 176B
semver.cmd 176B
semver.cmd 176B
semver.cmd 176B
gulp.cmd 174B
shjs.cmd 174B
user-home.cmd 174B
strip-bom.cmd 174B
jsdoc.cmd 170B
rimraf.cmd 168B
mime.cmd 164B
mime.cmd 164B
ipaddr.test.coffee 13KB
ipaddr.coffee 12KB
static.coffee 688B
test.coffee 9B
cup.coffee 1B
mug.coffee 0B
jsl.node.conf 7KB
jsl.node.conf 7KB
CONTRIBUTORS 524B
CONTRIBUTORS 524B
tocdoc.css 124KB
jquery-ui.min.css 30KB
widgets.css 20KB
style.css 7KB
jsdoc-default.css 6KB
jsdoc-default.css 6KB
menubutton.css 5KB
lighter.css 5KB
base.css 5KB
qunit.css 5KB
InfoBoxDescription.css 4KB
BaseLayerPicker.css 3KB
Animation.css 2KB
NavigationHelpButton.css 2KB
CesiumInspector.css 2KB
InfoBox.css 2KB
prettify-tomorrow.css 2KB
prettify-tomorrow.css 2KB
SceneModePicker.css 2KB
Timeline.css 2KB
lighter.css 2KB
prettify-jsdoc.css 1KB
prettify-jsdoc.css 1KB
shared.css 1KB
Geocoder.css 1KB
Viewer.css 1KB
CesiumWidget.css 1006B
lighter.css 890B
lighterShared.css 886B
共 6368 条
- 1
- 2
- 3
- 4
- 5
- 6
- 64
看不见的天边
- 粉丝: 17
- 资源: 4612
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论4