JS promise - 在 JavaScript 中使用 promise

位置:首页>文章>详情   分类: Web前端 > 编程技术   阅读(309)   2023-06-26 07:54:31

JS promise 教程展示了如何在 JavaScript 中使用 promise。

A 表示将来某个时间可用的潜在值或错误。

Promise 可以具有以下状态之一:

  • pending - 初始状态,既未完成也未拒绝
  • fulfilled - 操作成功完成
  • 拒绝 - 操作失败

我们使用回调或 async/await 关键字处理 promises。

在某些编程语言中,Promises 被称为 futures。

JS Promise.resolve

Promise.resolve 方法返回一个使用给定值解析的 Promise 对象。

main.js
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 关键字。

main.js
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 对象。

main.js
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 链接承诺

可以通过链接执行多个异步操作。

main.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。

当所有承诺都已解决时,此返回的承诺将解决。它会在任何输入承诺被错误拒绝后立即拒绝。

main.js
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

JS 多个请求与 axios

在下一个例子中,我们使用 axois 库来执行多个 get 请求。 Axios 是用于 Node 和浏览器的基于 promise 的 HTTP 客户端。

$ npm i axios

我们安装 Axios 库。

main.js
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。

main.js
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 中的承诺。

地址:https://www.cundage.com/article/javascript-promise.html

相关阅读

Big.js 教程展示了如何使用 Big.js 模块在 JavaScript 中使用任意精度的大十进制算法。 大.js 大.js 是一个小型、快速的 JavaScript 库,用于任意精度的十进...
faker.js 教程展示了如何使用 faker.js 库在 JavaScript 中生成虚假数据。 伪造者.js 伪造者.js 是一个用于生成假数据的 JavaScript 库。构建和测试我们...
Node.js 教程是 Node.js 的入门教程。我们描述了 Node.js 并提供了一些 Node.js 代码示例。 Nojde.js 节点.js 是一个开源、跨平台的 JavaScript...
JavaScript 数组教程展示了如何在 JavaScript 中使用数组。 数组是许多值的集合。数组项称为数组的元素。每个元素都可以通过索引引用。数组是从零开始的。 JavaScript 数...
Liquid.js 教程展示了如何在 JavaScript 应用程序中使用 Liquid 模板引擎。 液体 液体 是一个 JavaScript 模板引擎。它是由 Shopify 创建的。 Liq...
Rollup.js 教程展示了如何使用 Rollup.js 模块打包器。 卷起 是一个 JavaScript 模块打包器。它将较小的代码片段编译成较大的库或应用程序包
Moment.js 教程展示了如何使用 Moment.js 模块在 JavaScript 中处理日期和时间。 时刻.js 时刻.js 是一个轻量级的 JavaScript 日期库,用于解析、验证...
Day.js 教程展示了如何使用 Day.js 模块在 JavaScript 中处理日期和时间。 日.js Day.js 是一个极简主义的 JavaScript 日期库,用于解析、验证、操作和格...
JavaScript JSON.parse 教程展示了如何将 JSON 字符串解析为 JavaScript 对象。 JSON JSON(JavaScript 对象显示法) 是一种轻量级数据交换格...
在本教程中,我们展示了如何在 JavaScript 中创建和使用模块。 模块 是 JavaScript 代码的容器。模块在单独的文件中定义。模块的目的是组织和隔离代码。 JavaScript 多...