这期内容当中小编将会给大家带来有关在javascript中使用promise时需要注意哪些事项,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
一、promise描述
promise是javascript中标准的内置对象,用于表示一个异步操作的最终状态(是失败还是成功完成)及其结果值。它让你能够把异步操作最终成功或者失败的原因和响应的处理程序相关联,也就是说通过promise你可以自定义异步操作结束后该做什么。这样的话异步方法就和同步方法很类似,也有返回值,只不过这个返回值不是立即返回最终的值,而是返回一个promise,当promise的状态发生改变时,就会触发相应的处理程序。
一个promise无论什么时候都必然处于以下几种状态:1、待定(pending) 2、已兑现(fulfilled) 3、已拒绝(rejected)
promise创建之初是待定状态,它既咩有被兑现也咩有被拒绝,它用于包装还没有被添加promise支持的函数,包装后的函数变成异步操作函数,当操作结束时,会有两个两个分支,一个是已兑现,一个是已拒绝,如下图。已兑现状态的promise会调用后续的then方法,而已拒绝状态的promise既可以调用then方法,也可以被catch方法捕捉到。为什么then方法可以捕捉两个状态的promise呢?这里先不讲,下面再详细介绍。
二、promise 的流程走向
上图是promise的流程图,从左到右可以得知一个promise在待定状态时通过两个分支走向分别进入then方法或者catch方法,这两个c方法都会返回promise,如果这个promise也被敲定了,而且其后也有then方法或者catch方法,则又会进入后续的then和catch中,直至咪有。
也就是说,promise和then或者catch可以形成一个异步操作的链式结构,结合js的事件循环机制,这使得js的优势更加明显,发展至今仍能在浏览器上频繁看到它的身影。
我们要注意流程的特点:
1、promise是对象,它的转移成功不取决于返回值,而取决于状态的敲定(是成功还是失败)
2、then和catch是函数,只要有promise状态发生了改变,该promise对应后面的then或者catch方法就会被调用,而这两个方法本身会返回一个promise,这个返回的promise又会影响这两个方法后面的then或者catch方法。两个方法的返回值一定是promise。
三、promise的创建
Promise
对象是由关键字new
及其构造函数来创建的。该构造函数会把一个叫做“处理器函数”(executor function)的函数作为它的参数。这个“处理器函数”接受两个函数——resolve
和reject
——作为其参数。当异步任务顺利完成且返回结果值时,会调用resolve
函数;而当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用reject
函数。示例如下:
let myFirstPromise = new Promise(function(resolve, reject){ ,//当异步代码执行成功时,我们才会调用解决(…),,当异步代码失败时就会调用拒绝(…) ,//在本例中,我们使用setTimeout(…)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API的方法。 ,setTimeout(函数(){ 解决才能(“成功!“),,//代码正常执行! ,},250); }); myFirstPromise.then(函数(successMessage) { ,//successMessage的值是上面调用解决(…)方法传入的值。 ,//successMessage参数不一定非要是字符串类型,这里只是举个例子 ,console.log(“耶!,,,+,successMessage); });
四、承诺的优势
在承诺未出现时,如果我们调用异步代码块的话是没有办法保持顺序的,而如果又出现了异步代码结果之间按序的需求,该如何实现呢?
以前的话通常都会将异步代码一层一层地内嵌来实现异步代码按序实现,但是这就造成了代码维护困难,开发难度增大
doSomething(函数(结果),{ ,doSomethingElse(因此,函数(newResult), { ,doThirdThing (newResult,函数(finalResult), { console.log才能(& # 39;Got 从而final 结果:,& # 39;,+,finalResult); ,},failureCallback); ,},failureCallback); },,failureCallback);
这就是经典的回调地狱。而如果使用了前面介绍的诺言,那么代码就变成了容易维护的链式结构