标签:递归 不可 wrap 前端 data cti return ons catch
一、
Promise API 概述
var p = new Promise( function(resolve,reject){ // resolve(..) 用于决议 / 完成这个 promise // reject(..) 用于拒绝这个 promise } );
reject(..) 就是拒绝这个 promise ;但 resolve(..) 既可能完成 promise ,也可能拒绝,要
根据传入参数而定。如果传给 resolve(..) 的是一个非 Promise 、非 thenable 的立即值,这个 promise 就会用这个值完成。但是,如果传给 resolve(..) 的是一个真正的 Promise 或 thenable 值,这个值就会被递归展开,并且(要构造的) promise 将取用其最终决议值或状态
二、
var p = Promise.resolve(42); p.then( function fulfilled(msg) { // 数字没有 string 函数,所以会抛出错误 console.log(msg.toLowerCase()); }, function rejected(err) { // 永远不会到达这里 } );
msg.toLowerCase() 合法地抛出一个错误,为什么我们的错误处理函数没有得到通知呢?正如前面解释过的,这是因为那个错误处理函数是为 promise p 准备的,而这个 promise 已经用值 42 填充了。 promise p 是不可变的,所以唯一可以被通知这个错误的 promise 是从 p.then(..) 返回的那一个,但我们在此例中没有捕捉。
为了避免丢失被忽略和抛弃的 Promise 错误,一些开发者表示, Promise 链的一个最佳实践就是最后总以一个catch(..) 结束,比如:
var p = Promise.resolve(42); p.then( function fulfilled(msg) { // 数字没有 string 函数,所以会抛出错误 console.log(msg.toLowerCase()); }, function rejected(err) { // 永远不会到达这里 } ).catch(function(err){ console.log(err); })
四、对方法进行Promise包装
if(!Promise.wrap){ Promise.wrap = function(fn){ return function(){ var args = [].slice.call(arguments); return new Promise(function(resolve,reject){ fn.apply(null,args.concat(function(err,v){ if(err){ reject(err); }else{ resolve(v); } })) }) } } } function myajax(url,cb){ $.ajax({ url: url, type: ‘GET‘, }) .done(function(data) { cb(null,data) }) .fail(function(err) { cb(err) }) } var request = Promise.wrap(myajax); request(‘api/xxx‘)
欢迎加入大前端交流群!群号:277942610
标签:递归 不可 wrap 前端 data cti return ons catch
原文地址:https://www.cnblogs.com/liumingwang/p/10207971.html