[![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q)
<a href="http://promises-aplus.github.com/promises-spec">
<img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png"
align="right" alt="Promises/A+ logo" />
</a>
If a function cannot return a value or throw an exception without
blocking, it can return a promise instead. A promise is an object
that represents the return value or the thrown exception that the
function may eventually provide. A promise can also be used as a
proxy for a [remote object][Q-Connection] to overcome latency.
[Q-Connection]: https://github.com/kriskowal/q-connection
On the first pass, promises can mitigate the “[Pyramid of
Doom][POD]”: the situation where code marches to the right faster
than it marches forward.
[POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/
```javascript
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
```
With a promise library, you can flatten the pyramid.
```javascript
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
```
With this approach, you also get implicit error propagation, just like `try`,
`catch`, and `finally`. An error in `promisedStep1` will flow all the way to
the `catch` function, where it’s caught and handled. (Here `promisedStepN` is
a version of `stepN` that returns a promise.)
The callback approach is called an “inversion of control”.
A function that accepts a callback instead of a return value
is saying, “Don’t call me, I’ll call you.”. Promises
[un-invert][IOC] the inversion, cleanly separating the input
arguments from control flow arguments. This simplifies the
use and creation of API’s, particularly variadic,
rest and spread arguments.
[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
## Getting Started
The Q module can be loaded as:
- A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and
gzipped.
- A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as
the [q](https://npmjs.org/package/q) package
- An AMD module
- A [component](https://github.com/component/component) as ``microjs/q``
- Using [bower](http://bower.io/) as ``q``
- Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
## Resources
Our [wiki][] contains a number of useful resources, including:
- A method-by-method [Q API reference][reference].
- A growing [examples gallery][examples], showing how Q can be used to make
everything better. From XHR to database access to accessing the Flickr API,
Q is there for you.
- There are many libraries that produce and consume Q promises for everything
from file system/database access or RPC to templating. For a list of some of
the more popular ones, see [Libraries][].
- If you want materials that introduce the promise concept generally, and the
below tutorial isn't doing it for you, check out our collection of
[presentations, blog posts, and podcasts][resources].
- A guide for those [coming from jQuery's `$.Deferred`][jquery].
We'd also love to have you join the Q-Continuum [mailing list][].
[wiki]: https://github.com/kriskowal/q/wiki
[reference]: https://github.com/kriskowal/q/wiki/API-Reference
[examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery
[Libraries]: https://github.com/kriskowal/q/wiki/Libraries
[resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources
[jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
[mailing list]: https://groups.google.com/forum/#!forum/q-continuum
## Tutorial
Promises have a ``then`` method, which you can use to get the eventual
return value (fulfillment) or thrown exception (rejection).
```javascript
promiseMeSomething()
.then(function (value) {
}, function (reason) {
});
```
If ``promiseMeSomething`` returns a promise that gets fulfilled later
with a return value, the first function (the fulfillment handler) will be
called with the value. However, if the ``promiseMeSomething`` function
gets rejected later by a thrown exception, the second function (the
rejection handler) will be called with the exception.
Note that resolution of a promise is always asynchronous: that is, the
fulfillment or rejection handler will always be called in the next turn of the
event loop (i.e. `process.nextTick` in Node). This gives you a nice
guarantee when mentally tracing the flow of your code, namely that
``then`` will always return before either handler is executed.
In this tutorial, we begin with how to consume and work with promises. We'll
talk about how to create them, and thus create functions like
`promiseMeSomething` that return promises, [below](#the-beginning).
### Propagation
The ``then`` method returns a promise, which in this example, I’m
assigning to ``outputPromise``.
```javascript
var outputPromise = getInputPromise()
.then(function (input) {
}, function (reason) {
});
```
The ``outputPromise`` variable becomes a new promise for the return
value of either handler. Since a function can only either return a
value or throw an exception, only one handler will ever be called and it
will be responsible for resolving ``outputPromise``.
- If you return a value in a handler, ``outputPromise`` will get
fulfilled.
- If you throw an exception in a handler, ``outputPromise`` will get
rejected.
- If you return a **promise** in a handler, ``outputPromise`` will
“become” that promise. Being able to become a new promise is useful
for managing delays, combining results, or recovering from errors.
If the ``getInputPromise()`` promise gets rejected and you omit the
rejection handler, the **error** will go to ``outputPromise``:
```javascript
var outputPromise = getInputPromise()
.then(function (value) {
});
```
If the input promise gets fulfilled and you omit the fulfillment handler, the
**value** will go to ``outputPromise``:
```javascript
var outputPromise = getInputPromise()
.then(null, function (error) {
});
```
Q promises provide a ``fail`` shorthand for ``then`` when you are only
interested in handling the error:
```javascript
var outputPromise = getInputPromise()
.fail(function (error) {
});
```
If you are writing JavaScript for modern engines only or using
CoffeeScript, you may use `catch` instead of `fail`.
Promises also have a ``fin`` function that is like a ``finally`` clause.
The final handler gets called, with no arguments, when the promise
returned by ``getInputPromise()`` either returns a value or throws an
error. The value returned or error thrown by ``getInputPromise()``
passes directly to ``outputPromise`` unless the final handler fails, and
may be delayed if the final handler returns a promise.
```javascript
var outputPromise = getInputPromise()
.fin(function () {
// close files, database connections, stop servers, conclude tests
});
```
- If the handler returns a value, the value is ignored
- If the handler throws an error, the error passes to ``outputPromise``
- If the handler returns a promise, ``outputPromise`` gets postponed. The
eventual value or error has the same effect as an immediate return
value or thrown error: a value would be ignored, an error would be
forwarded.
If you are writing JavaScript for modern engines only or using
CoffeeScript, you may use `finally` instead of `fin`.
### Chaining
There are two ways to chain promises. You can chain promises
没有合适的资源?快使用搜索试试~ 我知道了~
cordova插件开发 (手机单核多核)
共1547个文件
class:330个
js:296个
md:240个
需积分: 10 6 下载量 197 浏览量
2014-09-23
16:15:43
上传
评论
收藏 13.95MB RAR 举报
温馨提示
使用cordova开平台开发 代码亲测亲手写的 可用 验证就是手机CPU的核数 只是android的实现没有写ios平台 在研究插件的人可以看一下 有详细的注释
资源推荐
资源详情
资源评论
收起资源包目录
cordova插件开发 (手机单核多核) (1547个子文件)
android_sdk_version 1KB
resources.ap_ 1.9MB
NCores.apk 2.13MB
list-started-emulators.bat 1KB
list-emulator-images.bat 1KB
install-emulator.bat 1KB
install-device.bat 1KB
start-emulator.bat 1KB
list-devices.bat 1KB
version.bat 1015B
build.bat 1010B
clean.bat 1010B
log.bat 1006B
run.bat 1006B
build 1KB
check_reqs 1KB
ContactAccessorSdk5.class 38KB
FileUtils.class 26KB
CordovaWebView.class 24KB
CordovaActivity.class 21KB
CameraLauncher.class 21KB
HttpEngine.class 17KB
DiskLruCache.class 17KB
LocalFilesystem.class 15KB
HttpURLConnectionImpl.class 15KB
FileTransfer.class 14KB
SpdyConnection.class 14KB
Globalization.class 14KB
Capture.class 14KB
InAppBrowser.class 13KB
FileTransfer$3.class 13KB
ResponseHeaders.class 12KB
FileTransfer$4.class 12KB
RawHeaders.class 12KB
ContentFilesystem.class 12KB
AudioPlayer.class 12KB
PluginManager.class 12KB
CordovaResourceApi.class 12KB
CordovaChromeClient.class 12KB
SpdyStream.class 10KB
HttpsURLConnectionImpl.class 10KB
HttpResponseCache.class 10KB
InAppBrowser$5.class 10KB
Connection.class 10KB
OkHttpClient.class 9KB
Util.class 9KB
Job.class 9KB
SpdyConnection$Reader.class 9KB
HttpResponseCache$Entry.class 9KB
AudioHandler.class 8KB
RequestHeaders.class 8KB
CordovaWebViewClient.class 8KB
NativeToJsMessageQueue.class 8KB
Http20Draft06$Reader.class 7KB
Spdy3$Reader.class 7KB
ConnectionPool.class 7KB
RouteSelector.class 7KB
HttpTransport.class 7KB
NetworkManager.class 7KB
Platform.class 7KB
Spdy3$Writer.class 7KB
App.class 6KB
AccelListener.class 6KB
Config.class 6KB
Filesystem.class 6KB
CompassListener.class 6KB
Hpack$Reader.class 6KB
ContactManager.class 6KB
SpdyStream$SpdyDataInputStream.class 6KB
Notification.class 6KB
InAppBrowser$InAppBrowserClient.class 5KB
DistinguishedNameParser.class 5KB
OkHostnameVerifier.class 5KB
SpdyTransport.class 5KB
PluginResult.class 5KB
DiskLruCache$Editor.class 5KB
SpdyStream$SpdyDataOutputStream.class 5KB
Http20Draft06$Writer.class 5KB
BatteryListener.class 4KB
Capture$2.class 4KB
ContactAccessor.class 4KB
FileHelper.class 4KB
DiskLruCache$Entry.class 4KB
FileHelper.class 4KB
FileHelper.class 4KB
Request$Builder.class 4KB
HttpTransport$ChunkedInputStream.class 4KB
IceCreamCordovaWebViewClient.class 4KB
Platform$JdkWithJettyNpnPlatform.class 4KB
InAppChromeClient.class 4KB
HttpAuthenticator.class 4KB
HttpAuthenticator$1.class 4KB
Settings.class 4KB
Spdy3.class 4KB
Notification$3.class 4KB
Address.class 4KB
Request.class 3KB
ExifHelper.class 3KB
NameValueBlockReader.class 3KB
InAppBrowser$1.class 3KB
共 1547 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
土小土
- 粉丝: 57
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功