码迷,mamicode.com
首页 > 其他好文 > 详细

深入浅出:promise的各种用法

时间:2018-08-31 19:17:51      阅读:203      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!