You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varp1=newPromise(function(resolve,reject){resolve(1)})varp2=newPromise(function(resolve,reject){setTimeout(function(){resolve(2)},1000);})p1.then(function(value){console.log(value);// 1},function(){// never gets here})p2.then(function(value){console.log(value);// 2},function(){// never gets here})
varp1=newPromise(function(resolve,reject){reject('rejected because ...')})p1.then(function(value){console.log(value);// never gets here},function(reason){console.log(reason);// rejected because ...})
varp1=newPromise(function(resolve,reject){thrownewError('test error')resolve(1)})varp2=newPromise(function(resolve,reject){'1'.toFixed()// number has not toString method ,so it will throw exceptionresolve(2)})p1.then(function(value){console.log(value);// never gets here},function(error){console.log(error.message)// test error})p2.then(function(value){console.log(value);// never gets here},function(error){console.log(error.message)// "1".toFixed is not a function})
then 会返回另一个 promise,这个 promise 会使用 then( onFulfilled, onRejected ) 两个回调函数中的任何一个函数的返回值作为成功状态的值。这么做的目的是可以产生链式调用。
varp1=newPromise(function(resolve,reject){resolve(1)})varp11=p1.then(function(value){returnvalue*3;},funtion(){// never gets here});p11.then(function(value){console.log(value);// 3},function(){}{// never gets here})/*上述改成链式调用的写法就是:p1.then( function(value){ return value * 3;} ).then( function(value){ console.log( value ); // 3} )*/varp2=newPromise(function(resolve,reject){'1'.toFixed()// number has not toString method ,so it will throw exceptionresolve(2)// never gets here})// p2 rejected的情况,以下采用链式调用写法p2.then(function(){// never gets here},function(error){console.log(error.message)// "1".toFixed is not a functionreturn4;}).then(function(value){console.log(value);// 4})// 如果 onFullfilled, onRejected 没有返回则会获得 undefined, newPromise(function(resolve,reject){resolve(1)}).then(function(value){console.log(value);// 1},function(){// never gets here}).then(function(value){console.log(value);// undefined},function(){// never gets here})
newPromise(function(resolve,reject){resolve(1);}).then(function(){thrownewError('test error1');return2;// never gets here}).then(function(){// never gets here},function(error){console.log(error.message);// test error1})newPromise(function(resolve,reject){thrownewError('test error2');resolve(1);// never gets here}).then(function(){// never gets here},function(error){console.log(error.message);// test error2thrownewError('test error3');}).then(function(error){// never gets here},function(error){console.log(error.message);// test error3})
如果 promise1.then( onFulfilled, onRejected ) 没有传入回调函数,则 then 返回的 promise2 继承 promise1 的状态。从原理上来说就是 promsie1 成功或者失败后调用 then 没有函数去处理(成功没有注册 onFulfilled,失败没有注册 onRejected),则 then 返回的 promise2 将依然保持 promise1 的状态。
newPromise(function(resolve,reject){resolve(1);}).then(null,null).then(function(value){console.log(value);// 1})newPromise(function(resolve,reject){thrownewError('test error');resolve(1);// never gets here}).then().then(function(){// never gets here},function(error){console.log(error.message);// test error})
varp0=newPromise(function(res,rej){res(0);});// fulfilled promisevarp1=newPromise(function(resolve,reject){resolve(p0);});p1.then(function(value){console.log(value);// 0},function(){// never gets here});varp2=newPromise(function(res,rej){thrownewError('test error')});// rejected promisenewPromise(function(resolve,reject){resolve(p2);}).then(function(){// never gets here},function(error){console.log(error.message);// test error})
varp1=newPromise(function(){thrownewError('make rejected');});p1.then(null,function(error){console.log(error.message);// make rjected});p1.catch(function(error){console.log(error.message);// make rjected});// p1.then(null,onRejected) 和 p1.catch(onRejected) 是完全等价的。// 链式调用newPromise(function(resolve,rejected){resolve(0);}).then(function(value){// some code here, may generate some errorreturnvalue++;}).then(function(value){// some code here, may generate some errorreturnvalue++;}).then(function(value){// some code here, may generate some errorreturnvalue++;}).then(function(value){// some code here, may generate some errorreturnvalue++;}).catch(function(error){// 上面任何一个 then 都没有设置 onRejected 回调函数,意味着,一旦有一个 onFulfilled 里面一旦报错,则一个失败状态的 promise 会得不到处理,一直延续到最后一个被 catch 处理。// 如果理解不了,则自行拆解每个 then})
Promise.resolve( value ) 返回一个成功的 promise1,其值是 value。如果 value 是一个 promise0,意味着 promise1 将把自己的状态和 promise0 同步,ES6 进一步优化了这种情况,如果 value 是一个 promise,则直接返回这个 promise。
不深入只浅出ES6 Promise | 笔记
用例子直观的陈列 Promise 的行为作为笔记(如果能帮助新手快速了解 Promise 的使用自然最好,最终还是希望不但要学会使用还要了解规范),此行为规范基于的是 ES6 的规范,以后 JS 规范更新可能改变某些行为。原理及规范请查看考如下资料:
无论构造时候 executor 中被传入的 resolve 函数是同步地被调用还是异步地被调用,只要传入的是一个非 promise 非 thenable 的值,都会在 then 传入的第一个回调函数(onFulfilled)中获得这个值,第二个回调函数(onRejected)不会被调用到。
一个 promise.then 中的两个回调函数只有一个会被调用,因为 promise 的状态要么是成功的,要么是失败的,不会在成功失败间相互转换。
Promise.resolve( value )
返回一个成功的 promise1,其值是 value。如果 value 是一个 promise0,意味着 promise1 将把自己的状态和 promise0 同步,ES6 进一步优化了这种情况,如果 value 是一个 promise,则直接返回这个 promise。Promise.reject( reason )
返回一个失败的 promise1,其值是 reason。这个无二义性。Promise.all( [promise0, promise0, ..., promiseN] )
返回一个 promsie,如果 promise0 - promiseN 全部成功了,则这个最终的 promise 成功。如果但凡 promise0 - promiseN 中有任意一个失败了,则最终的 promise 立即失败。Promise.all( [1, 'abc', ..., promiseN] )
参数数组允许非 promise 的值,Promise.all 这个方法会把所有非 Promise 对象的值用 Promise.resolve( v ) 包装成一个 promise。Promise.race( [promise0, promise0, ..., promiseN] )
返回一个 promsie,这个返回的 promise 状态就是 promise0 - promiseN 中第一个成功或者第一个失败的 promise 的状态。Promise.race( [] ).then( onFulfilled, onRejected )
如果参数为空数组,则返回的 promise 永远不会成功或者失败(onFulfilled, onRejected 永远不会被调用)。因为空数组中没有 promise 会成功失败,即永远没有 promise 来竞争来使 Promise.race 返回的 promise 变成功或者失败。文中总结了 promise 的一般用法,没有涉及到异步和 thenable 的概念。异步的概念我还需要进一步看些资料,一时我也没有钻的比较深。thenable 除非你项目是老项目,里面会用到 promise 出现前的一些内容(譬如 jQuery 中的 defer),一般是不太会涉及到这个概念,你就先理解成 thenable 对象是一个带 then 方法的对象,但是它本身不是 Promise 对象,具体还是希望各位看官查看文章开始所列的资料。
The text was updated successfully, but these errors were encountered: