1 介绍
做什么
什么时候会来异步处理时间呢?
new Promise((resolve, reject) => {
setTimeout(() => {
reject('error')
}, 1000)
}).then((data) => {
console.log(data);
}).catch((err) => {
console.log(err);
})
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello')
reject('error')
})
}).then(res => {
console.log('失败')
}, err => {
console.log('失败')
console.log(res)
})
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('aaa')
}, 1000)
}).then(res => {
console.log(res, '第一层处理的10行代码')
throw 'error'
}).then(res => {
console.log(res, '第二层的10行处理代码');
return res + '222'
}).then(res => {
console.log(res, '第三层的10行处理代码');
}).catch(err => {
console.log(err)
})
多个异步请求处理逻辑
$ajax({
url: '',
success: function () {
console.log('结果1')
isResult1 = true
handleResult()
}
})
$ajax({
url: '',
success: function () {
console.log('结果2')
isResult1 = true
handleResult()
}
})
function handleResult() {
if (isResult1 && isResult2) {
}
}
Promise的all方法使用
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result1')
}, 1000)
}),
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result2')
}, 1000)
})
]).then(results => {
console.log(results);
})
<h2><a id="1__0"></a>1 介绍</h2>
<p>做什么</p>
<ul>
<li>是一种异步编程的方案</li>
</ul>
<p>什么时候会来异步处理时间呢?</p>
<ul>
<li>
<p>网络请求</p>
</li>
<li>
<p>如果只是一个简单的网络请求,那么这种方案不会给我们带来很大的麻烦</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 什么情况下会用到Promise</span>
<span class="hljs-comment">// 一般情况下有异步操作时,使用Promist对这个异步操作进行封装</span>
<span class="hljs-comment">// new -> 构造函数(1.保存了一些状态信息, 2.执行传入的函数)</span>
<span class="hljs-comment">// 在执行传入回调函数时,会传入两个参数,rresolve,reject,本身又是函数</span>
<span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =></span> {
<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
<span class="hljs-comment">// 成功</span>
<span class="hljs-comment">// resolve('hello')</span>
<span class="hljs-comment">// 失败</span>
<span class="hljs-title function_">reject</span>(<span class="hljs-string">'error'</span>)
}, <span class="hljs-number">1000</span>)
}).<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">data</span>) =></span> {
<span class="hljs-comment">// 处理代码</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(data);
}).<span class="hljs-title function_">catch</span>(<span class="hljs-function">(<span class="hljs-params">err</span>) =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(err);
})
</code></div></pre>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =></span> {
<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
<span class="hljs-title function_">resolve</span>(<span class="hljs-string">'hello'</span>)
<span class="hljs-title function_">reject</span>(<span class="hljs-string">'error'</span>)
})
}).<span class="hljs-title function_">then</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> {
<span class="hljs-comment">// console.log('成功')</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'失败'</span>)
}, <span class="hljs-function"><span class="hljs-params">err</span> =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'失败'</span>)
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(res)
})
</code></div></pre>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =></span> {
<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
<span class="hljs-title function_">resolve</span>(<span class="hljs-string">'aaa'</span>)
}, <span class="hljs-number">1000</span>)
}).<span class="hljs-title function_">then</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> {
<span class="hljs-comment">// 1. 自己处理10行代码</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(res, <span class="hljs-string">'第一层处理的10行代码'</span>)
<span class="hljs-comment">// 2. 对结果进行第一次处理</span>
<span class="hljs-comment">// return res + '111'</span>
<span class="hljs-keyword">throw</span> <span class="hljs-string">'error'</span>
}).<span class="hljs-title function_">then</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(res, <span class="hljs-string">'第二层的10行处理代码'</span>);
<span class="hljs-keyword">return</span> res + <span class="hljs-string">'222'</span>
}).<span class="hljs-title function_">then</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(res, <span class="hljs-string">'第三层的10行处理代码'</span>);
}).<span class="hljs-title function_">catch</span>(<span class="hljs-function"><span class="hljs-params">err</span> =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(err)
})
</code></div></pre>
<p>多个异步请求处理逻辑</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 请求一</span>
$ajax({
<span class="hljs-attr">url</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">success</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'结果1'</span>)
isResult1 = <span class="hljs-literal">true</span>
<span class="hljs-title function_">handleResult</span>()
}
})
<span class="hljs-comment">// 请求二</span>
$ajax({
<span class="hljs-attr">url</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">success</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'结果2'</span>)
isResult1 = <span class="hljs-literal">true</span>
<span class="hljs-title function_">handleResult</span>()
}
})
<span class="hljs-keyword">function</span> <span class="hljs-title function_">handleResult</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">if</span> (isResult1 && isResult2) {
}
}
</code></div></pre>
<h2><a id="Promiseall_99"></a>Promise的all方法使用</h2>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
<span class="hljs-comment">// new Promise((resolve, reject) => {</span>
<span class="hljs-comment">// $ajax({</span>
<span class="hljs-comment">// url: 'url1',</span>
<span class="hljs-comment">// success: function () {</span>
<span class="hljs-comment">// resolve(data)</span>
<span class="hljs-comment">// }</span>
<span class="hljs-comment">// })</span>
<span class="hljs-comment">// }),</span>
<span class="hljs-comment">// new Promise((resolve, reject) => {</span>
<span class="hljs-comment">// $ajax({</span>
<span class="hljs-comment">// url: 'url2',</span>
<span class="hljs-comment">// success: function () {</span>
<span class="hljs-comment">// resolve(data)</span>
<span class="hljs-comment">// }</span>
<span class="hljs-comment">// })</span>
<span class="hljs-comment">// })</span>
<span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =></span> {
<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
<span class="hljs-title function_">resolve</span>(<span class="hljs-string">'result1'</span>)
}, <span class="hljs-number">1000</span>)
}),
<span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =></span> {
<span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =></span> {
<span class="hljs-title function_">resolve</span>(<span class="hljs-string">'result2'</span>)
}, <span class="hljs-number">1000</span>)
})
]).<span class="hljs-title function_">then</span>(<span class="hljs-function"><span class="hljs-params">results</span> =></span> {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(results);
})
</code></div></pre>
留言