"I Promise a Result!"
"Producing code" 是可能需要一些时间的代码
"Consuming code" 是必须等待结果的代码
Promise 是一个连接生成代码和使用代码的 JavaScript 对象
JavaScript Promise 对象包含生成代码和对消费代码的调用:
let myPromise = new Promise(function(myResolve, myReject) {
// "Producing Code" (May take some time)
myResolve(); // when successful
myReject(); // when error
});
// "Consuming Code" (Must wait for a fulfilled Promise)
myPromise.then(
function(value) { /* code if successful */ },
function(error) { /* code if some error */ }
);
当生成代码获得结果时,它应该调用两个回调之一:
结果 | 称呼 |
---|---|
成功 | myResolve(结果值) |
错误 | myReject(错误对象) |
JavaScript Promise 对象可以是:
Promise 对象支持两个属性:状态和结果。
虽然 Promise 对象是"pending"(工作),但结果是未定义的。
当 Promise 对象为 "fulfilled" 时,结果是一个值。
当 Promise 对象为 "rejected" 时,结果是错误对象。
myPromise.state | myPromise.结果 |
---|---|
"pending" | 不明确的 |
"fulfilled" | 结果值 |
"rejected" | 一个错误对象 |
您无法访问 Promise 属性状态和结果。
您必须使用 Promise 方法来处理 Promise。
以下是如何使用 Promise:
myPromise.then(
function(value) { /* code if successful */ },
function(error) { /* code if some error */ }
);
Promise.then() 有两个参数,一个是成功的回调,另一个是失败的回调。
两者都是可选的,因此您只能添加成功或失败的回调。
function myDisplayer(some) {
document.getElementById("demo").innerHTML = some;
}
let myPromise = new Promise(function(myResolve, myReject) {
let x = 0;
// The producing code (this may take some time)
if (x == 0) {
myResolve("OK");
} else {
myReject("Error");
}
});
myPromise.then(
function(value) {myDisplayer(value);},
function(error) {myDisplayer(error);}
);
为了演示 Promise 的使用,我们将使用上一章中的回调示例:
setTimeout(function() { myFunction("I love You !!!"); }, 3000);
function myFunction(value) {
document.getElementById("demo").innerHTML = value;
}
let myPromise = new Promise(function(myResolve, myReject) {
setTimeout(function() { myResolve("I love You !!"); }, 3000);
});
myPromise.then(function(value) {
document.getElementById("demo").innerHTML = value;
});
function getFile(myCallback) {
let req = new XMLHttpRequest();
req.open('GET', "mycar.html");
req.onload = function() {
if (req.status == 200) {
myCallback(req.responseText);
} else {
myCallback("Error: " + req.status);
}
}
req.send();
}
getFile(myDisplayer);
let myPromise = new Promise(function(myResolve, myReject) {
let req = new XMLHttpRequest();
req.open('GET', "mycar.htm");
req.onload = function() {
if (req.status == 200) {
myResolve(req.response);
} else {
myReject("File not Found");
}
};
req.send();
});
myPromise.then(
function(value) {myDisplayer(value);},
function(error) {myDisplayer(error);}
);
ECMAScript 2015,也称为 ES6,引入了 JavaScript Promise 对象。
下表定义了第一个完全支持 Promise 对象的浏览器版本:
Chrome 33 | Edge 12 | Firefox 29 | Safari 7.1 | Opera 20 |
Feb, 2014 | Jul, 2015 | Apr, 2014 | Sep, 2014 | Mar, 2014 |
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!