var x,y = 2; console.log( x + y );//NaN <-- 因为x还没赋值;
沿着这个简单的demo思路,如果x没赋值,期望运算符+本身能够检测并等待x和y都准备好再进行运算是没有意义的,如果有的语句现在完成,有的是将来完成,那么是会在程序里引起混乱的。
如果两个语句的任何一个可能还没完成,你怎么追踪这两条语句的关系呢?
如果语句B依赖于语句A的完成,那么就有两种结果输出:要么语句A完成,一切顺利执行;要么语句A未完成,语句B也就跟着失败。
回到demo的思路,把x和y相加,一旦他们都准备好就马上执行相加运算,试着用回调处理这个问题:
function add(getX,getY,sum){ var x,y; getX( funcion(xVal){ x = xVal; // 两个都准备好了? if(y != undefined){ sum{ x + y}; // 发送和 } }); getY( funcion(yVal){ y = yVal; // 两个都准备好了? if(x != undefined){ sum{ x + y}; // 发送和 } }); // fetchX()和fechY()是同步或者异步函数 add(fetchX,fetchY,funcion(sum){ console.log(sum); }) }
通过promise处理这个例子
funcion add(x,y){ // Promise.all[ .. ]接受一个promise数组并返回一个新的promis, // 这个新的promise等待数组中的promise完成 return Promise.all( [x,y] ) // 这个promise决议后,我们取得收到的X和Y值并加在一起 .then(function(values){ // values是来自于之前决议的promise的消息数组 return values[0] + values[1]; }); } // fetchX()和fetchY()返回相应值的promise,可能已经就绪,也可能以后就绪 add( fetchX(), fetchY() ) // 我们得到一个这两个数组的和promise,现在用链式调用then(..)来等待返回promise的决议 .then{function(sum){ console.log(sum); }}
这段代码中有两层Promise:
fetchX()和fetchY()是直接调用,他们的返回值(promise!)被传给add()。这些promise代表的底层值可用时间的现在和将来,但不管怎样,promise归一保证了行为的一致性。
第二层是add(..)(通过Promise.all([..]))创建并返回promise。我们通过调用then(..)等待这个promise。add(..)运算完成后,未来值sum就准备好了,可以打印出来。