JS promise 教程展示了如何在 JavaScript 中使用 promise。
A 表示将来某个时间可用的潜在值或错误。
Promise 可以具有以下状态之一:
- pending – 初始状态,既未完成也未拒绝
- fulfilled – 操作成功完成
- rejected – 操作失败
我们使用回调或 async/await 关键字处理 promises。
Promise 在某些编程语言中称为 future。
JS Promise.resolve
Promise.resolve
方法返回一个使用给定值解析的 Promise 对象。
let promise = new Promise(resolve => { setTimeout(() => resolve(2), 2000); }); promise.then(val => console.log(val)); console.log('finished');
我们创建了一个 promise,它在两秒后解析为一个整数值。 then
函数附加回调以解决和/或拒绝承诺。
$ node main.js finished 2
在下一个示例中,我们使用 async/await 关键字。
async function doWork() { let res = await promise; console.log(res); } let promise = new Promise(resolve => { setTimeout(() => resolve(2), 2000); }); doWork(); console.log('finished');
await
关键字用于等待 Promise。它只能在异步函数中使用。
JS 承诺错误
Promise.reject
方法返回一个因给定原因被拒绝的 Promise 对象。
let promise = new Promise((resolve, reject) => { let b = Math.random() < 0.3; if (b) { resolve(10); } else { reject("promise error"); } }); promise.then(val => console.log(val)).catch(err => { console.log(`${err}`) }); console.log('finished');
在示例中,我们使用Math.random
模拟错误。我们用catch
方法捕获错误。
$ node main.js finished promise error $ node main.js finished promise error $ node main.js finished 10
JS 链接承诺
可以通过链接执行多个异步操作。
let p = new Promise((resolve) => { resolve(1); }); let r = p.then(val => val + 2).then(val => val + 3) .then(val => val + 4).then(val => console.log(val)); console.log('finished');
该示例通过承诺链添加四个整数。
$ node chain.js finished 10
JS Promise.all
Promise.all
方法将可迭代的 promise 作为参数,并返回一个解析为给定 promise 结果数组的单一 promise。
当所有承诺都已解决时,此返回的承诺将解决。它会立即拒绝任何错误拒绝的输入承诺。
const p1 = new Promise((resolve) => setTimeout(resolve, 100, 100)); const p2 = new Promise((resolve) => setTimeout(resolve, 300, 200)); const p3 = new Promise((resolve) => setTimeout(resolve, 500, 300)); const promises = [p1, p2, p3]; Promise.all(promises).then((data) => console.log(data.reduce((total, next) => total + next))); console.log('finished');
在这个例子中,我们等待所有的承诺完成,最后,我们计算返回值的总和。
$ node all.js finished 600
使用 axios 的 JS 多个请求
在下一个示例中,我们使用 axois 库执行多个 get 请求。axios 是一个基于 promise 的 HTTP 客户端,适用于 Node 和浏览器。
$ npm i axios
我们安装 Axios 库。
const axios = require('axios'); async function makeRequests(urls) { const fetchUrl = (url) => axios.get(url); const promises = urls.map(fetchUrl); let responses = await Promise.all(promises); responses.forEach(resp => { let msg = `${resp.config.url} -> ${resp.headers.server}: ${resp.status}`; console.log(msg); }); } let urls = [ 'http://webcode.me', 'https://example.com', 'http://httpbin.org', 'https://clojure.org', 'https://fsharp.org', 'https://symfony.com', 'https://www.perl.org', 'https://www.php.net', 'https://www.python.org', 'https://code.visualstudio.com', 'https://github.com' ]; makeRequests(urls);
我们等待所有请求以Promise.all
结束。完成后,我们遍历响应数组和服务器名称以及响应状态。
$ node main.js http://webcode.me -> nginx/1.6.2: 200 https://example.com -> ECS (dcb/7ECA): 200 http://httpbin.org -> gunicorn/19.9.0: 200 https://clojure.org -> AmazonS3: 200 https://fsharp.org -> GitHub.com: 200 https://symfony.com -> cloudflare: 200 https://www.perl.org -> Combust/Plack (Perl): 200 https://www.php.net -> myracloud: 200 https://www.python.org -> nginx: 200 https://code.visualstudio.com -> Microsoft-IIS/10.0: 200 https://github.com -> GitHub.com: 200
JS 用 Puppeteer 创建 PDF
在下面的示例中,我们使用 Puppeteer 库从网页生成 PDF 文件。
$ npm i puppeteer
我们安装 Puppeteer。
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('http://webcode.me'); await page.pdf({ path: 'webcode.pdf', format: 'a5' }); await browser.close(); })();
整个任务由多个异步操作组成,使用async/await关键字处理。
在本文中,我们使用了 JavaScript 中的 promises。
列出所有 JavaScript 教程。