src/cm/media/js/lib/yui/yui_3.10.3/docs/promise/index.html
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 525 89ef5ed3c48b
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
<!DOCTYPE html>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
<html lang="en">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
<head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
    <meta charset="utf-8">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
    <title>Promise</title>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
    <link rel="stylesheet" href="../../build/cssgrids/cssgrids-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
    <link rel="stylesheet" href="../assets/css/main.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
    <link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
    <script src="../../build/yui/yui-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
</head>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
<body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
<!--
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
<a href="https://github.com/yui/yui3"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
-->
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
<div id="doc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    <div id="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
        <h1><img src="http://yuilibrary.com/img/yui-logo.png"></h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
        <a href="#toc" class="jump">Jump to Table of Contents</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
            <h1>Promise</h1>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
    <div class="yui3-g">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
        <div class="yui3-u-3-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
            <div id="main">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
                <div class="content"><link type="text/css" rel="stylesheet" href="../../build/cssbutton/cssbutton-min.css">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
<div class="intro">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
        Promises are a tool to help write asynchronous code in a more readable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
        style that looks more like synchronous code.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
        In short, promises allow you to interact with a value that may or may
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
        not be available yet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
        Promises let wrap, and even chain, asynchronous operations using a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
        consistent API, avoiding writing nested anonymous callbacks (the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
        "pyramid of doom"). And they let you handle any errors that happen
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
        during those operations.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
    <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
        The <code>Y.Promise</code> class is compatible with the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
        <a href="http://promises-aplus.github.com/promises-spec/">Promises/A+</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
        specification.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
    </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
<h2 id="getting-started">Getting Started</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
To include the source files for Promise and its dependencies, first load
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
the YUI seed file if you haven't already loaded it.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
<pre class="code prettyprint">&lt;script src=&quot;http:&#x2F;&#x2F;yui.yahooapis.com&#x2F;3.10.3&#x2F;build&#x2F;yui&#x2F;yui-min.js&quot;&gt;&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
Next, create a new YUI instance for your application and populate it with the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
modules you need by specifying them as arguments to the <code>YUI().use()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
YUI will automatically load any dependencies required by the modules you
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
specify.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
<pre class="code prettyprint">&lt;script&gt;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
&#x2F;&#x2F; Create a new YUI instance and populate it with the required modules.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
YUI().use(&#x27;promise&#x27;, function (Y) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
    &#x2F;&#x2F; Promise is available and ready for use. Add implementation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
    &#x2F;&#x2F; code here.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
&lt;&#x2F;script&gt;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
For more information on creating YUI instances and on the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
<a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_use"><code>use()</code> method</a>, see the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
documentation for the <a href="../yui/index.html">YUI Global Object</a>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
<h2 id="the-basics">The Basics</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
    As mentioned above, promises allow you to interact with a value that may or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
    may not be available yet.  In synchronous code, values are assigned to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
    variables and immediately available to use, but if you need to use or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
    assign a value that depends on an asynchronous operation to get, the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
    rest of your code needs to be wrapped in a callback that is executed when
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
    that asynchronous operations completes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
    Callbacks work, but they don't maintain any state, the APIs responsible for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
    the callbacks are likely to differ, and they might not handle errors. It's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
    also quite easy to find yourself building up multi-step transactions by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
    nesting anonymous callbacks multiple levels deep.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
    Promises address this by providing an object that can be referred to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
    immediately and any time in the future that represents the value produced
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
    by the asynchronous operation. Here's how you use them:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
<h3 id="two-simple-methods">Two Simple Methods</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
    Promises operate using two methods: the <code>Y.Promise</code> constructor, and the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
    promise instance's <code>then()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
<pre class="code prettyprint">&#x2F;&#x2F; Create a promise for a value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
var promise = new Y.Promise(function (resolve, reject) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
    var promisedValue;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
    &#x2F;&#x2F; ...do some work to assign promisedValue, most likely asynchronously
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
    &#x2F;&#x2F; When the work is done, fulfill the promise with the resolve function,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
    &#x2F;&#x2F; which was passed in the arguments.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    resolve(promisedValue);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
    &#x2F;&#x2F; Or if something went wrong, reject the promise with the reject function,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
    &#x2F;&#x2F; also passed in the arguments.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
    reject(reasonForFailure);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
&#x2F;&#x2F; Do something with the promised value using the then() method. then() takes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
&#x2F;&#x2F; two functions as arguments. promise.then(onFulfilled, onRejected);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
promise.then(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
    &#x2F;&#x2F; aka onFulfilled
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
    function (promisedValue) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
        alert(&quot;Here&#x27;s that value I promised I&#x27;d get for you: &quot; + promisedValue);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
    &#x2F;&#x2F; aka onRejected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    function (reason) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
        alert(&quot;Oh no! I broke my promise. Here&#x27;s why: &quot; + reason);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
    });</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
<h3 id="creating-a-promise">Creating a Promise</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
    The <code>Y.Promise</code> constructor takes as its argument a function we'll call the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
    "executor function". This function is responsible for saying when the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
    promised value is ready, or notifying that something went wrong.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
    The executor function receives two customized functions as its arguments,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
    commonly called <code>resolve</code> and <code>reject</code>. If the work in the executor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
    function to get the promised value completes successfully, pass the value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
    to the <code>resolve()</code> method. If something went wrong, pass the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
    reason&mdash;commonly an <code>Error</code>&mdash;to the <code>reject()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
<pre class="code prettyprint">&#x2F;&#x2F; dataPromise represents the data parsed from the IO response,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
&#x2F;&#x2F; or the error that occurred fetching it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
var dataPromise = new Y.Promise(function (resolve, reject) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
    Y.io(&#x27;getdata.php&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
        on: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
            success: function (id, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
                &#x2F;&#x2F; The IO completed, so the promise can be resolved
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
                try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
                    resolve(Y.JSON.parse(response.responseText));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
                } catch (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
                    &#x2F;&#x2F; any failure to produce the value is a rejection
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
                    reject(e);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
            failure: function (id, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
                &#x2F;&#x2F; The IO failed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
                reject(new Error(&quot;getdata.php request failed: &quot; + response));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
});</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
<h3 id="resolving-a-promise">Resolving a Promise</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
    Promises can be in one of three states:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
<ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
    <li><code>pending</code>   - the promised value is not ready yet (default)</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
    <li><code>fulfilled</code> - the value is ready</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
    <li><code>rejected</code>  - something went wrong, the value can't be produced</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
</ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
    "Resolving" a promise moves a <code>pending</code> promise to either <code>fulfilled</code> or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
    <code>rejected</code>, though the term is often used interchangeably with "fulfill"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
    (it's good to have a positive outlook). Once a promise is fulfilled or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
    rejected, it can't be transitioned to another state.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
    There are two ways promises get resolved. The first is using the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
    <code>resolve()</code> function passed to the executor function in the <code>Y.Promise</code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
    constructor. We'll talk about the second way when we discuss <a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
    href="#promise-chaining">promise chaining</a>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
<h3 id="getting-the-promised-value">Getting the Promised Value</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
    Since the promised value probably isn't ready when you create the promise,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
    you can't synchronously consume the value. Schedule the code that will use
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
    the promised value to execute with the promise's <code>then()</code> method.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
    <code>then()</code> takes two callbacks as arguments, that we call <code>onFulfilled</code> and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
    <code>onRejected</code>. As you might have guessed, the <code>onFulfilled</code> callback is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
    executed if the promise resolves to a value, and the <code>onRejected</code> callback
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
    is executed if it is rejected.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
    Only one of the callbacks will be executed, and only once.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
    <a href="#omitting-onfulfilled-or-onrejected">Both callbacks are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
    optional</a>, though in practice you'll always pass at least one to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
    <code>then()</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
<pre class="code prettyprint">var stuff;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
var promise = new Y.Promise(getStuff);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
&#x2F;&#x2F; When getStuff says the promise is fulfilled, update the stuff variable.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
&#x2F;&#x2F; No onRejected callback is passed, so if there was an error, do nothing.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
promise.then(function (stuffValue) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
    stuff = stuffValue;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
&#x2F;&#x2F; Stuff isn&#x27;t populated yet because the promise hasn&#x27;t been fulfilled
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
console.log(&quot;Stuff value is &quot; + stuff); &#x2F;&#x2F; =&gt; &quot;Stuff value is undefined&quot;</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
    You can call <code>then()</code> on the promise as many times as you like. The same
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
    value will be passed to each <code>then()</code> callback.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
<h4 id="always-asynchronous">Always Asynchronous</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
    It's important to note that even if the <code>getStuff</code> function above resolved
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
    the promise immediately, callbacks scheduled with <code>then</code> will
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
    <strong>always be called asynchronously</strong>. So the example code above
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
    will always log "Stuff value is undefined", regardless of whether
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
    <code>getStuff</code> operates synchronously or asynchronously.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
    To limit the runtime impact of <code>then</code> callbacks always being executed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
    asynchronously, they are scheduled using
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
    <a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_soon"><code>Y.soon()</code></a>, which
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
    will attempt to avoid any minimum delay that some browsers impose on
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
    <code>setTimeout</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
<h2 id="the-not-so-basics">The Not-so Basics</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
<h3 id="promise-chaining">Promise Chaining</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
    Here's where things start getting fun. When you call <code>promise.then(...)</code>,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
    a new promise is returned. The new promise will resolve when either of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
    original promise's <code>onFulfilled</code> or <code>onRejected</code> functions returns a value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
    or throws an error. This allows you to schedule several operations using
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
    chained <code>then()</code> calls.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
<pre class="code prettyprint">&#x2F;&#x2F; Verbose form
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
startSpinner();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
&#x2F;&#x2F; Create the initial promise
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
var userDataLoaded = new Y.Promise(function (resolve, reject) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
    Y.io(&#x27;getUserData.php&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
        data: &#x27;id=1234&#x27;,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
        on: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
            success: function (id, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
                try {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
                    resolve(Y.JSON.parse(response.responseText));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
                } catch (e) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
                    reject(e);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
            failure: function (id, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
                reject(new Error(response));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
&#x2F;&#x2F; after the user data is loaded, render stuff or show the loading error
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
var uiUpdated = userDataLoaded.then(renderTemplates, showError);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
&#x2F;&#x2F; after the UI is updated, stop the spinner
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
uiUpdated.then(stopSpinner);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
&#x2F;&#x2F; Concise form (more common)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
&#x2F;&#x2F; Note Y.Promise can be called without &#x27;new&#x27;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
Y.Promise(function (resolve, reject) { Y.io(...); })
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
    .then(renderTemplates, showError) &#x2F;&#x2F; returns another promise
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
    .then(stopSpinner);               &#x2F;&#x2F; returns another promise</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
    A chained promise is resolved by the return value of the previous promise's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
    callbacks. Or, if an error is thrown, the chained promise is rejected.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
    Note that functions will return <code>undefined</code> if no explicit <code>return</code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
    statement is included. That will result in the promise being fulfilled with
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
    a value of <code>undefined</code>. Sometimes that's okay, but it's often helpful to pass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
    along <em>some</em> data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
<pre class="code prettyprint">function renderTemplates(userData) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
    &#x2F;&#x2F; Update the UI
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
    Y.one(&#x27;#userForm&#x27;).setHTML(Y.Lang.sub(MyApp.userFormTemplate, userData));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
    &#x2F;&#x2F; return a value to resolve the chained promise (aka uiUpdated) and pass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
    &#x2F;&#x2F; to the uiUpdated&#x27;s then(onFulfilled) callback, stopSpinner
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
    return true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
function stopSpinner(updated) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
    &#x2F;&#x2F; updated will receive the return value of the previous promise&#x27;s callback
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
    &#x2F;&#x2F; In this case, the boolean true.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
    var face = updated ? happyFace : sadFace;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
    spinnerNode.replace(face).hide(true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
&#x2F;&#x2F; Using the original promise from the example above
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
userDataLoaded
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
    .then(renderTemplates, showError)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
    .then(stopSpinner);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
<h3 id="handling-errors">Handling Errors</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
    When a promise is rejected, the <code>onRejected</code> callback (the second argument
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
    to <code>then()</code>) is executed. Like <code>onFulfilled</code>, it is called with whatever is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
    passed to the executor function's <code>reject()</code> function.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
    The <code>onRejected</code> callback can then re-throw the error to propagate the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
    failed state, or recover from the failure by returning a value. Again,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
    without an explicit <code>throw</code> or <code>return</code>, the callback will return
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
    <code>undefined</code> <em>which will mark the failure as recovered</em>, but with a resolved
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
    value of <code>undefined</code>. This may not be what you want!
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
<pre class="code prettyprint">function showError(reason) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
    Y.one(&#x27;#userForm&#x27;).hide(true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
    Y.one(&#x27;#message .details&#x27;).setHTML(reason.message || reason);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
    Y.one(&#x27;#message&#x27;).show();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
    &#x2F;&#x2F; Choosing not to re-throw the error, but consider it recovered from for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
    &#x2F;&#x2F; the sake of this transaction. Returning false as resolved value to send
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
    &#x2F;&#x2F; to stopSpinner.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
    return false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
userDataLoaded
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
    .then(renderTemplates, showError)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
    .then(stopSpinner);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
    Because <code>showError</code> returned a value, and didn't re-throw the <code>reason</code>,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
    the promise wrapping <code>renderTemplates</code> and <code>showError</code> was resolved to a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
    "fulfilled" state with a value of <code>false</code>. Since the promise was fulfilled,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
    not rejected, that promise's <code>onFulfilled</code> callback (<code>stopSpinner</code>) is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
    called with the value <code>false</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
<h4 id="caveat-the-unhandled-rejection">Caveat: The Unhandled Rejection</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
    Because thrown errors are caught by the <code>Y.Promise</code> internals and used as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
    a signal to reject a promise, it's possible to write promise chains that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
    fail silently. This can be hard to debug.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
    To avoid this, it's highly recommended to <strong>always</strong> include
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
    an <code>onRejected</code> callback at the end of your promise chains. The reason you
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
    only need to put one at the end is discussed below.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
<h3 id="omitting-onfulfilled-or-onrejected">Omitting <code>onFulfilled</code> or <code>onRejected</code></h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
    Both <code>onFulfilled</code> and <code>onRejected</code> callbacks are optional, though in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
    practice, you will always pass at least one. When a callback isn't provided
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
    for a <code>then()</code> call in a promise chain, that promise is automatically
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
    fulfilled with the value returned from the prior <code>onFulfilled</code> callback or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
    rejected with the reason thrown from the prior <code>onRejected</code> callback.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
<pre class="code prettyprint">getHandleFromServerA()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
    .then(null, getHandleFromServerB)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
    .then(getUserData)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
    .then(renderTemplates, showError);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
&#x2F;&#x2F; Same code, commented
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
&#x2F;&#x2F; Try to get a DB handle from Server A...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
getHandleFromServerA()
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
    &#x2F;&#x2F; if that fails, try Server B, otherwise, pass through the Server A handle
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
    .then(null, getHandleFromServerB)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
    &#x2F;&#x2F; if either server provided a handle, get user data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
    &#x2F;&#x2F; otherwise, there was an error, so pass it along the chain
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
    .then(getUserData)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
    &#x2F;&#x2F; render the user data if everything worked.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
    &#x2F;&#x2F; if there was an error getting a DB handle or getting user data show it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
    .then(renderTemplates, showError);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
    It's not uncommon to see promise chains with only <code>onFulfilled</code> callbacks,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
    then an <code>onRejected</code> callback at the very end.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
<h3 id="chaining-asynchronous-operations">Chaining Asynchronous Operations</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
    As mentioned above, the return value from either <code>onFulfilled</code> or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
    <code>onRejected</code> fulfills the promise with that value. <em>There is one
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
    exception</em>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
    If you return a promise instead of a regular value (call it
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
    <code>returnedPromise</code>), the original promise will wait for <code>returnedPromise</code> to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
    resolve, and adopt its state when it does. So if <code>returnedPromise</code> is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
    fulfilled, the original promise is fulfilled with the same value, and if
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
    <code>returnedPromise</code> is rejected, the original promise is rejected with the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
    same reason.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
<pre class="code prettyprint">Y.Promise(function (resolve, reject) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
        Y.io(&#x27;getDataUrl.php&#x27;, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
            on: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
                success: function (id, response) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
                    resolve(response.responseText);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
                },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
                failure: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
                    reject(new Error(&quot;Can&#x27;t reach the server&quot;));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
    })
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
    &#x2F;&#x2F; Chain another async operation by returning a promise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
    &#x2F;&#x2F; Don&#x27;t worry, we&#x27;ll wait for you.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
    .then(function (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
        return new Y.Promise(function (resolve, reject) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
            &#x2F;&#x2F; Do another async operation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
            Y.jsonp(data.url, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
                on: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
                    success: resolve,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
                    failure: reject
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
    })
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
    &#x2F;&#x2F; Called after both async operations have completed. The data response
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
    &#x2F;&#x2F; from the JSONP call is passed to renderTemplates
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
    .then(renderTemplates)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
    &#x2F;&#x2F; Then wait for 2 seconds before continuing the chain
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
    .then(function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
        return new Y.Promise(function (resolve) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
            setTimeout(resolve, 2000);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
    })
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
    .then(hideMessage, showError);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
    Similarly, you can pass a promise to the <code>resolve()</code> function passed to the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
    <code>Y.Promise</code> executor function.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
    <strong>Caution</strong>: Do not pass a promise to <code>reject()</code> or <code>throw</code> a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
    promise from a callback. You're definitely doing something wrong if you
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
    find yourself doing that.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
<h3 id="ywhen-for-promise-wrapping"><code>Y.when()</code> For Promise Wrapping</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
    If you're unsure if a variable has a value or a promise, or you want an API
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
    to support both value or promise inputs, use <code>Y.when(value)</code> to wrap
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
    non-promise values in promises. Wrapped non-promise values will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
    immediately fulfilled with the wrapped value. Passing a promise to <code>Y.when</code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
    will return the promise.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
<pre class="code prettyprint">&#x2F;&#x2F; Accept either a regular object or a promise to save
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
MyDatabase.prototype.save = function (key, data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
    &#x2F;&#x2F; Ensure we are dealing with a promise and call then() to get its value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
    &#x2F;&#x2F; return the promise chained off this then() call
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
    return Y.when(data).then(function (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
        &#x2F;&#x2F; Store the data somehow, for instance in localStorage
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
        localStorage.set(key, data);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
    });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
};</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
<h3 id="non-serial-operation-batching">Non-serial Operation Batching</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
    Promise chaining works great to serialize synchronous and asynchronous
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
    operations, but often several asynchronous operations can be performed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
    simultaneously. This is where <code>Y.batch()</code> comes in.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
    <code>Y.batch()</code> takes any number of promises as arguments, and returns a new
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
    promise that will resolve when all the batched promises have resolved. The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
    resolved value will be an array of values from the individual promises, in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
    the order they were passed to <code>Y.batch()</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
    If any one of the batched promises should be rejected, the batch promise
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
    is immediately rejected with that reason, so failures can be dealt with
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
    sooner rather than later.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
<pre class="code prettyprint">Y.batch(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
        getUserAccountInfo(userId),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
        getUserPosts(userId, { page: 1, postsPerPage: 5 }),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
        getUserRank(userId)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
    )
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
    .then(function (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
        var account = data[0],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
            posts   = data[1],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
            rank    = data[2];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
        ...
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
    }, handleError);</pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
<!--h3>Custom Promises</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
    `Y.Promise is built to support creating custom subclasses that support
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
    more descriptive names. Subclass methods can access the resolution
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
    mechanism for the promise via <code>this._resolver</code>.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
<pre class="code prettyprint"></pre>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
-->
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
<h2 id="faq">FAQ</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
<ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
    <li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
        <a href="#diff">What's the difference between <code>Y.Promise</code> and...?</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
    </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
    <li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
        <a href="#plans">What are the plans for promises in the library?</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
    </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
<h3 id="diff">What's the difference between <code>Y.Promise</code> and...</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
<h4 id="events">Events?</h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
    Events are used to create a relationship between two objects, and better
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
    represent an open communication channel. Promises represent single values,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
    and chains encapsulate transactions.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
    It's not uncommon to have event subscribers launch a promise chain, or to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
    have events fired from within operations inside a promise chain. They are
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
    complementary tools.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
<h4 id="yasyncqueue"><code>Y.AsyncQueue</code></h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
    <code>Y.AsyncQueue</code> is a tool for splitting up long synchronous operations into
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
    asynchronous chunks to avoid blocking UI updates unnecessarily. It doesn't
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
    (as yet) support asynchronous steps. It also supports conditional looping
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
    and various other things that promises don't, out of the box.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
<h4 id="yparallel"><code>Y.Parallel</code></h4>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
    <code>Y.Parallel</code> is similar to <code>Y.batch</code> in that it provides a mechanism to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
    execute a callback when several independent asynchronous operations have
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
    completed. However, it doesn't handle errors or guarantee asynchronous
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
    callback execution. It is also transactional, but the batch of operations
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
    is bound to a specific callback, where <code>Y.batch()</code> returns a promise that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
    represents the aggregated values of those operations. The promise can be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
    used by multiple consumers if necessary.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
<h3 id="plans">What are the plans for Promises in the library?</h3>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
<p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
    There are a lot of opportunities inside YUI to move transactional APIs to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
    consume and/or return promises rather than use callbacks or one-time
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
    events. While there are no set plans for which APIs will be changed or in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
    what priority order, you can expect to see promises showing up across the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
    library in the near future.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
        <div class="yui3-u-1-4">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
            <div class="sidebar">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
                    <div id="toc" class="sidebox">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
                        <div class="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
                            <h2 class="no-toc">Table of Contents</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
                        <div class="bd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
                            <ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
<a href="#getting-started">Getting Started</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
<a href="#the-basics">The Basics</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
<a href="#two-simple-methods">Two Simple Methods</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   659
<a href="#creating-a-promise">Creating a Promise</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   660
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   662
<a href="#resolving-a-promise">Resolving a Promise</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   663
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   664
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
<a href="#getting-the-promised-value">Getting the Promised Value</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
<a href="#always-asynchronous">Always Asynchronous</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
<a href="#the-not-so-basics">The Not-so Basics</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
<a href="#promise-chaining">Promise Chaining</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
<a href="#handling-errors">Handling Errors</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
<a href="#caveat-the-unhandled-rejection">Caveat: The Unhandled Rejection</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
<a href="#omitting-onfulfilled-or-onrejected">Omitting <code>onFulfilled</code> or <code>onRejected</code></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
<a href="#chaining-asynchronous-operations">Chaining Asynchronous Operations</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   695
<a href="#ywhen-for-promise-wrapping"><code>Y.when()</code> For Promise Wrapping</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   696
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   697
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
<a href="#non-serial-operation-batching">Non-serial Operation Batching</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
<a href="#faq">FAQ</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
<a href="#diff">What's the difference between <code>Y.Promise</code> and...</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
<ul class="toc">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
<a href="#events">Events?</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
<a href="#yasyncqueue"><code>Y.AsyncQueue</code></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
<a href="#yparallel"><code>Y.Parallel</code></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
<li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
<a href="#plans">What are the plans for Promises in the library?</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
</ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
                    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
                    <div class="sidebox">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
                        <div class="hd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
                            <h2 class="no-toc">Examples</h2>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
                        <div class="bd">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
                            <ul class="examples">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
                                        <li data-description="Wrapping async transactions with promises">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
                                            <a href="basic-example.html">Wrapping async transactions with promises</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
                                        <li data-description="Extend Y.Promise to create classes that encapsulate standard transaction logic in descriptive method names">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
                                            <a href="subclass-example.html">Subclassing Y.Promise</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
                                        <li data-description="Extend the Promise class to create your own Node plugin that chains transitions">
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
                                            <a href="plugin-example.html">Creating a Node Plugin that chains transitions</a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
                                        </li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
                                    
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
                                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
                            </ul>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
                        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
                    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
                
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
            </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
        </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
    </div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
</div>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
<script src="../assets/vendor/prettify/prettify-min.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
<script>prettyPrint();</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
<script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
YUI.Env.Tests = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
    examples: [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
    project: '../assets',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
    assets: '../assets/promise',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
    name: 'promise',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
    title: 'Promise',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
    newWindow: '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
    auto:  false 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
YUI.Env.Tests.examples.push('basic-example');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
YUI.Env.Tests.examples.push('subclass-example');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
YUI.Env.Tests.examples.push('plugin-example');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
</script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
<script src="../assets/yui/test-runner.js"></script>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
</body>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
</html>