promise可以解决多个回调函数嵌套问题,将嵌套所表示的流程通过同步的代码更加清晰的表达出来。
promise的用法与使用配置文件很类似:启动异步函数,在then里面配置好异步函数成功或执行失败的回调函数,然后就可以去干别的事了。
一个简单示例的执行过程
一个简单的示例如下:
var promise = new Promise(function(resolve, reject) {// 异步操作的代码.....if (true){resolve("已解决");} else {reject("出错了");}});promise.then(function(value){console.log(value);},function(error){console.log(error);});
上面的代码的时序图大体如下:
其中:
client – 主程序,Async – 异步函数,Promise,ResolvedInvoke – resolved状态回调函数,RejectedInvoke – rejected状态回调函数,resolve – resolve函数
几个关键过程说明如下:
(1.4 )调用异步函数Async之后,然后执行(1.5)会立即返回一个promise对象,然后主函数和异步函数同时往下执行。
(2.2) 指定promise的回调函数,主程序的任务完成,退出
(1.6)异步函数退出,调用resolve(),然后执行(1.7)改变promise的状态
当promise状态改变之后,执行(1.8)调用相应的回调函数。
所以,promise的执行过程大体如下:主程序创建promise并指定promise各种状态下的回调函数,promise调用异步函数并保存异步函数的执行状态,当异步函数退出时,可以调用resolve/reject改变promise的状态,promise在状态变化时调用相应的回调函数。
promise对象
promise保存着异步函数的执行状态。
异步函数通过调用resolve/reject改变promise的状态,主函数调用promise的then()方法指定promise在不同状态下的回调函数。然后,主程序和异步程序可以各自往下执行,当promise状态改变时,它会自动调用相应的回调函数。
也就是,主函数装配promise,异步函数改变promise状态,promise监听自身变化,调用相应回调函数进行处理。
then
then函数指定promise的回调函数,可以链式操作,可以返回值,其返回值如果不是一个Promise对象,则直接作为下一个then的参数,否则进行返回的这个Promise的异步函数,根据执行结果继续调用下一个then。
所以,只有在then里返回Promise的情况下,才能看出promise的厉害和用处。
作用
主要是解决多个回调函数的嵌套问题。下面例子就是两个原本需要嵌套的回调函数,使用同步的方式表达出来。
var promise = doSomething(false);promise.then(function(value){console.log(value);return doSomethingElse(true);},function(error){console.log(error);return doSomethingElse(false);}).then(function(){console.log("成功后接着处理");},function(){console.log("出错后接着处理");});function doSomething(param){//这里省略一些异步操作return new Promise(function(resolve, reject) {if (param){resolve("已解决");} else {reject("出错了");}});}function doSomethingElse(param){//这里省略一些异步操作return new Promise(function(resolve, reject) {if (param){resolve();} else {reject();}});}