深入浅出:promise的各种用法

Posted yunshangwuyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出:promise的各种用法相关的知识,希望对你有一定的参考价值。

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的各种用法的主要内容,如果未能解决你的问题,请参考以下文章

Promise对象深入理解

深入浅出理解Promise

深入理解 promise:promise的三种状态与链式调用

Promise原理详解

深入掌握 ECMAScript 6 异步编程:Generator 函数的含义与用法

ES6深入浅出-9 Promise-3.Promise的细节