es6学习笔记5--promise
所谓
如果某些事件不断地反复发生,一般来说,使用stream模式是比部署 基本用法Promise构造函数接受一个函数作为参数,该函数的两个参数分别是 var promise = new Promise(function(resolve,reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }); ? Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。 promise.then((value) { success },(error) { failure });
? Promise.prototype.catch()
getJSON("/posts.json").then((posts) { ... }).catch( 处理 getJSON 和 前一个回调函数运行时发生的错误 console.log('发生错误!',error); }); 上面代码中, p.then((val) => console.log("fulfilled:"catch((err) => console.log("rejected:" 等同于 p.then((val) => console.log(fulfilled:" 一般来说,不要在 bad promise .then((data) { success },1)">(err) { error }); good function(data) { cb success }) . error }); 上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面 跟传统的 Promise.all()
var p = Promise.all([p1,p2,p3]);
上面代码中,
下面是一个具体的例子。 生成一个Promise对象的数组 var promises = [2,3,5,7,11,13].map( (id) { return getJSON("/post/" + id + ".json"); }); Promise.all(promises).then( (posts) { (reason){ ... }); 上面代码中, Promise.race()
var p = Promise.race([p1,p3]);
上面代码中,只要
下面是一个例子,如果指定时间内没有获得结果,就将Promise的状态变为 var p = Promise.race([ fetch('/resource-that-may-take-a-while'), (resolve,reject) { setTimeout(() => reject(new Error('request timeout')),5000) }) ]) p.then(response => console.log(response)) p.catch(error => console.log(error)) 上面代码中,如果5秒之内 Promise.resolve()有时需要将现有对象转为Promise对象, var jsPromise = Promise.resolve($.ajax('/whatever.json'));
上面代码将jQuery生成的
Promise.resolve('foo') 等价于 new Promise(resolve => resolve('foo'))
(1)参数是一个Promise实例 如果参数是Promise实例,那么 (2)参数是一个
let thenable = { then: ); } };
let thenable =); } }; let p1 = Promise.resolve(thenable); p1.then((value) { console.log(value); 42 }); 上面代码中, (3)参数不是具有 如果参数是一个原始值,或者是一个不具有 var p = Promise.resolve('Hello'); p.then( (s){ console.log(s) }); Hello 上面代码生成一个新的Promise对象的实例 (4)不带有任何参数
所以,如果希望得到一个Promise对象,比较方便的方法就是直接调用 Promise.resolve(); p.then( () { ... }); 上面代码的变量 Promise.reject()
var p = Promise.reject('出错了'); var p = new Promise((resolve,reject) => reject('出错了')) p.then(null,1)"> 出错了 上面代码生成一个Promise对象的实例 两个有用的附加方法ES6的Promise API提供的方法不是很多,有些有用的方法可以自己部署。下面介绍如何部署两个不在ES6之中、但很有用的方法。 done()Promise对象的回调链,不管以 asyncFunc() .then(f1) .catch(r1) .then(f2) .done(); 它的实现代码相当简单。 Promise.prototype.done = (onFulfilled,onRejected) { this.then(onFulfilled,onRejected) . (reason) { 抛出一个全局错误 setTimeout(() => { throw reason },0); }); }; 从上面代码可见, finally()
下面是一个例子,服务器使用Promise处理请求,然后使用 server.listen(0) .then( () { run test finally(server.stop); 它的实现也很简单。 Promise.prototype.finally = (callback) { let P = .constructor; return .then( value => P.resolve(callback()).then(() => value),reason => P.resolve(callback()).then(() => { throw reason }) ); }; 上面代码中,不管前面的Promise是 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – Sqlite3 gem未加载,gem安装并在项目中指定
- NoSQL to MySQL with Memcached
- c# – BackgroundWorker OnWorkCompleted抛出跨线程异常
- c# – 是否可以将插值字符串作为参数传递给方法?
- 利用正则表达式限制EditText小数点前后位数和格式
- React Native中的Google字体
- Creating a noSql database, what is the best source code
- c# – ASP.NET MVC4 Razor on Mono EF 6 DateTime崩溃
- Xcode模拟器列表中iOS版本的奇怪字符串
- ruby-on-rails – 空集合检查返回false而没有条目(Ruby on