重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

javascriptPromise是什么

这篇文章主要介绍“javascript Promise是什么”,在日常操作中,相信很多人在javascript Promise是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript Promise是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

公司主营业务:成都网站制作、网站设计、外贸网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出碌曲免费做网站回馈大家。

什么是Promise

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

上面是Promise的一个定义,引自阮一峰的ES6标准入门一书。S6标准入门。多说一句,目前的JavaScript项目无论是前台或者是后台,都应该采用ES6的标准语法来写,ES6让JavaScript的书写更加的清晰和规范。

基本用法

如何来构造一个promise对象呢?ES6中提供了原生Promise可以使用。

var promise = new Promise(function(resolve, reject) {   // ... here is some code    if (/* 异步操作成功 */){     resolve(value);   } else {     reject(error);   } });

上面的例子给出了new一个promise对象的方法,Promise的构造函数接受一个函数作为参数传入,这个函数的两个参数,reject和resolve是JavaScript本身提供的两个函数。一个promise对象有三个状态分别是,pending,resolved,rejected。resolve函数可以将pending状态转变为resolved状态。reject函数可以讲pending状态转变了rejected状态。对象的状态不受外界的影响,同样也是promise名字的由来。外部你拿着我的一个承诺,一会我会告诉你我的状态。

promise对象通过then方法来添加回调函数。例如这样

promise.then(data=> console.log(data), err=> console.log(err));

当promise被resolved的时候,就会把data  log出来。当promise被rejected的时候,err就会被log出来。看上去好像是挺简单的,的确Promise的应用使得异步的操作,以同步的形式表现出来。当发生错误的时候可以通过catch方法,来定义回调函数。

怎么用

上边都是一些干巴巴的定义,那么到底该怎么用呢?Promise又怎么样的解决了问题呢,下边我们看一个例子。假设下边一个场景,我们一个服务,从一个外边service获取数据,然后写到一个db里,或者一个存储里,***在把存储的状态龙出来,那么如果没有promise是怎么写的呢?可能会是这样。

getData(function (value1) {   storeToDb(value1, function(value2) {     logStore(value2, function(value3) {       //...     });   }); });

传统的回调的写法,这样使得代码逻辑混乱在一起。再想想如果再加上错误处理的情况,更是酸爽。那么用promise来写会怎么样呢?看下边这样的代码

function getData(){     return new Promise((resolve,reject) =>{         // ... send request to get data                  if(/* get successfully*/){             resolve(data)         }else{             reject(err)         }     }) }  function storeData(data){     return new Promise((resolve,reject)=>{         // ... store the data                  if(/*store successfully*/){             resolve(data)         }else{             reject(err)         }     }) }   getData()     .then(data => storeData(data))     .then(data => console.log('the process is done',data));     .catch(err => console.error('there is the err',err));

这样写是不是就是很清楚了,先getData,然后再storeData,***将这次运行的情况log了出来,其中有任何的问题,在catch中都可以Catch出来。代码的逻辑以同步的方式得到了体现。我们来看看如果是其他语言会怎么写,下边是个ruby的语言的例子

def get_data      // ...send request          if /*get successfully */         return data     else         raise GetDataError     end end   def store_data     // ...save to db          if /*save successfully */         return data     else         raise StoreDataError     end end   /*Main Logic*/ begin     request_data = get_data     db_data = store_data request_data     p "here is the store data #{db_data}" rescue e     p "here is some errors #{e}" end

我们对比两个例子,可以看到在使用的Promise后让JavaScript的异步方式的编程模式更将清楚,也更加让人容易理解。

由于JavaScript的执行环境是单线程的,所以大量采用了异步的方式来进行编程,这使得我们写起代码并不十分符合我们一般的习惯。但是Promise的出现让这种问题能得到一定程度的缓解。

但是异步操作异步操作的好处,比如上边的那个例子,如果我们想要做的同时并发10个操作,那个在ruby或者其他语言中中就要启多个线程来进行。但是JavaScript就完全没有这个问题。只要简单的loop下就行了。

但是如果我们想要在这10个操作完成后根据返回的状态做点其他操作该怎么做呢?这时候用Promise.all就是***的了。

let p = Promise.all([p1, p2, p3]);

Promise.all接受数组作为参数传入,每个元素都是一个promise对象。只要所有子promise都resolved以后,p才会被resolved。只要有一个被rejected,这个p就会被rejected。但是有一点是这些子promise之间并不会有顺序的关系。再来看一个例子:

var guid = 0; function run() {   guid++;   var id = guid;   return new Promise(resolve => {     setTimeout(function () {       console.log(id);       resolve(id);     }, (Math.random() * 1.5 | 0) * 1000);   }); }  var promises = Array.from({ length: 10 }, run); Promise.all(promises)

OUTPUT:

2 3 5 6 7 8 10 1 4 9

到此,关于“javascript Promise是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文题目:javascriptPromise是什么
分享网址:http://cqcxhl.cn/article/pjjihc.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP