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 )并不会取消请求,