JavaScript基础——Promise函数

混江龙づ霸主 提交于 2020-03-08 23:03:24

异步操作

JavaScript的异步处理可以用回调函数,回调函数的使用就是确保一段代码执行完毕之后再执行另一段代码的方式

function doHomework(subject, callback){
	console.log("start my " + subject + " homework.");
	callback();
}
function finish(){
	console.log("finish my homework.");
}
doHomework('math', finish);
// start my math homework.
// finish my homework.

finish函数作为回调函数,确保doHomework函数执行完毕之后才执行

promise函数用于异步操作,将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。同时把类似的异步处理对象和处理规则进行规范化,并按照采用统一的接口来编写,而采取规定方法之外的写法都会报错。

Promise函数基本用法

其实Promise函数的使命,就是构建出它的实例,并且负责帮我们管理这些实例。而这些实例有以下三种状态:

  • pending: 初始状态,未履行或拒绝
  • resolve: 意味着操作成功
  • rejecte: 意味着操作失败

基本用法如下,只写then或catch分别表示这个promise只执行resolve或reject的情况

new Promise(function(resolve,reject){
	//待执行的语句
	//调用resolve或reject方法,如resolve()/reject()
}).then(function(name){
	// resolve则执行的语句
}).catch(function(error){   //这行也可以简写成 }, function(){,不用catch
	// reject则执行的语句
});

resolve和reject都带参数的实例(暂时还不太懂),resolve方法和reject方法调用时,都带有参数。它们的参数会被传递给回调函数。

var getJSON = function(url) {
  var promise = new Promise(function(resolve, reject){
    var client = new XMLHttpRequest();
    client.open("GET", url);
    client.onreadystatechange = handler;
    client.responseType = "json";
    client.setRequestHeader("Accept", "application/json");
    client.send();
    function handler() {
      if (this.status === 200) { 
              resolve(this.response); 
          } else { 
              reject(new Error(this.statusText)); 
          }
    };
  });
  return promise;
};
getJSON("/posts.json").then(function(json) {
  console.log('Contents: ' + json);
}, function(error) {
  console.error('出错了', error);
});

Promise.resolve() 和Promise.reject()

将现有对象转为Promise对象

var p = Promise.resolve('Hello');
p.then(function (s){
  console.log(s)
});
// Hello

上述生成一个新的Promise对象实例p,状态为resolve,Promise.resolve()的参数就是回调函数的参数s

var p = Promise.reject('出错了');
p.catch(function (s){
  console.log(s)
});
// 出错了

上述生成一个新的Promise对象实例p,状态为reject,Promise.reject()的参数就是回调函数的参数s

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!