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