标签:console lin 完成 else 拒绝 调用 one hit xmlhttp
1.优点和缺点
可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
2.Promise规范如下:
一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
3.promise的特性:
(1.)立即执行性
var p=new Promise(function(resolve,reject)(){
console.log("create new promise");
resolve("success");
});
console.log("after new promise");
p.then(function(value){
console.log(value);
});
//create new promise
//after new promise
//success
(2.)状态不可逆,链式调用
var p = new Promise(function(resolve, reject){
resolve(1);
});
p.then(function(value){ //第一个then
console.log(value);
return value*2;
}).then(function(value){ //第二个then
console.log(value);
}).then(function(value){ //第三个then
console.log(value);
return Promise.resolve(‘resolve‘);
}).then(function(value){ //第四个then
console.log(value);
return Promise.reject(‘reject‘);
}).then(function(value){ //第五个then
console.log(‘resolve: ‘+ value);
}, function(err){
console.log(‘reject: ‘ + err);
})
//1
//2
//undefined
//resolve
//reject: reject
(3.)回调异步性
var p = new Promise(function(resolve, reject){
resolve("success");
});
p.then(function(value){
console.log(value);
});
console.log("first");
//"first"
//"success"
4.用法
function getURL(URL) {
return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
req.open(‘GET‘, URL, true);
req.onload = function () {
if (req.status === 200) {
resolve(req.responseText);
} else {
reject(new Error(req.statusText));
}
};
req.onerror = function () {
reject(new Error(req.statusText));
};
req.send();
});
}
// 运行示例
var URL = "http://httpbin.org/get";
getURL(URL).then(function onFulfilled(value){
console.log(value);
}).catch(function onRejected(error){
console.error(error);
});
原文参考:https://blog.csdn.net/qq_29849641/article/details/54970328
深入浅出:promise的各种用法
标签:console lin 完成 else 拒绝 调用 one hit xmlhttp
原文地址:https://www.cnblogs.com/yunshangwuyou/p/9567239.html