24.5 例子

在我们更加深入了解 Promise 之前,让我们在几个例子里面使用已经学到的知识。

本节的一些例子可以在 GitHub 仓库 promise-examples 中找到。

24.5.1 例子: Promise 化 fs.readFile()

下面的代码是一个内置的基于 Promise 版本的 Node.js 函数 fs.readFile()

import {readFile} from 'fs';

function readFilePromisified(filename) {
    return new Promise(
        function (resolve, reject) {
            readFile(filename, { encoding: 'utf8' },
                (error, data) => {
                    if (error) {
                        reject(error);
                    }
                    resolve(data);
                });
        });
}

readFilePromisified() 像下面这样使用:

readFilePromisified(process.argv[2])
.then(text => {
    console.log(text);
})
.catch(error => {
    console.log(error);
});

24.5.2 例子: Promise 化 XMLHttpRequest

下面是一个基于 Promise 的函数,通过基于事件的 XMLHttpRequest API 执行 HTTP GET 请求:

function httpGet(url) {
    return new Promise(
        function (resolve, reject) {
            let request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if (this.status === 200) {
                    // Success
                    resolve(this.response);
                } else {
                    // Something went wrong (404 etc.)
                    reject(new Error(this.statusText));
                }
            }
            request.onerror = function () {
                reject(new Error(
                    'XMLHttpRequest Error: '+this.statusText));
            };
            request.open('GET', url);
            request.send();
        });
}

下面是使用 httpGet() 的方式:

httpGet('http://example.com/file.txt')
.then(
    function (value) {
        console.log('Contents: ' + value);
    },
    function (reason) {
        console.error('Something went wrong', reason);
    });

24.5.3 例子:延迟操作

让我们将 setTimeout() 实现为基于 Promise 的函数 delay() (类似于 Q.delay() )。

function delay(ms) {
    return new Promise(function (resolve, reject) {
        setTimeout(resolve, ms); // (A)
    });
}

// Using delay():
delay(5000).then(function () { // (B)
    console.log('5 seconds have passed!')
});

注意,在行 A ,调用 resolve 的时候没传参数,这和 resolve(undefined) 是一样的。在行 B 也不需要成功完成的结果值,所以简单地忽略它。这里仅仅接收通知就够了。

24.5.4 例子: Promise 超时

function timeout(ms, promise) {
    return new Promise(function (resolve, reject) {
        promise.then(resolve);
        setTimeout(function () {
            reject(new Error('Timeout after '+ms+' ms')); // (A)
        }, ms);
    });
}

注意,在超时之后的驳回(行 A )并不会取消请求,

results matching ""

    No results matching ""