Promise 让异步更优
每个异步方法都返回一个Promise
更优雅.
then方法
每一个Promise 都有一个叫then 的方法,
接受一对callback 被解决时调用,resolve,
被拒绝 rejected 遇到错误
obj.save().then(function(obj){
}, function(error) {
});
第二个参数可选
try, catch, 和final方法
obj.save().try(function(obj) {
}).catch(function(error) {
}).finally(function(){
});
兼容其他Promise库,
别名
AV.Promise#done try
AV.Promise#fail catch
AV.Promise#always finally
obj.save().done(function(obj){
}).fail(function(error) {
}).always(function(){
});
将Promise 组织在一起
Promise 比较神奇, 代替多层嵌套方式来解决异步请求代码的调用顺序问题。
如果一个Promise的回调会返回一个Promise 那么
第二个then 里的callback 在第一个then 的callback 没有解决前是不会解决的.
Promise Chain
var query = new AV.Query('Student');
query.descending("gpa");
query.find().then(function(students){
students[0].set("valedictorian",true);
return students[0].save();
}).then(function(valedictorian) {
return query.find();
}).then(function(students){
students[1].set("salutatorian",true);
return students[1].save();
}).then(function(salutatorian){
});
错误处理
一个链中的Promise 返回一个错误的话, 所有成功的callback
在接下来都会被跳过直到遇到一个处理错误的callback
转换error 或者返回一个新的promise 来处理它.
var query = new AV.Query('Student');
query.descending('gpa');
query.find().then(function(students) {
students[0].set("valedictorian",true);
return AV.Promise.error("THere was an error.");
}).then(function(valedicator) {
return query.find();
}).then(function(students) {
students[1].set('salutatorian',true);
return students[1].save();
}, function(error) {
return AV.Promise.as('Hello');
}).then(funciton(hello) {
})
在正常情况的回调函数的未尾,加一个错误处理
的回调函数,是一种很常见的做法
var query = new AV.Query("Student");
query.descending("gpa");
query.find().try(function(students) {
students[0].set("valedictorian", true);
return AV.Promise.error("There was an error.";)
}).try(function(valedictorian) {
return query.find();
}).try(function() {
students[1].set()
}).catch(function(error) {
return AV.Promise.as("Hello!");
}).catch(fucntion(error) {
})
find save 会生成Promise
创建Promise
resolve reject 来触发它的callback
var successful = new AV.Promise();
successful.resolve("the good result");
var failed = new AV.Promise();
failed.reject("An error message.");
var successful = AV.Promise().as("The good reulst.";)
var failed = AV.Promise.error("The error message".
)
var promise = new AV.Promise(function(resolve,reject) {
resolve(42);
})
promise.then(function(ret) {
console.log(ret);
})
顺序的Promise
某一行的数据做一系列的任务的时候, Promise 链很方便的,
每一个任务都等着前一个任务结束。
删除你的博客上的所有评论。
var query = new AV.Query("Comment");
query.equal("post",post);
query.find().then( function(results) {
var promise = AV.Promise.as();
_.each(results, function(result) {
promise = promise.then(function() {
return result.destroy();
})
});
return promise;
}).then(function() {
});
并行的Promise
多个任务, when 方法, 开始几个操作。
作用AV.Promise.when 来创建一个新的promise
Promise 被resolve 之后ft才被resolve
更多消耗系统资源和带宽。
function timePromisefy(delay) {
return new AV.Promise(function(resolve) {
setTimeout(function() {
resolve(delay);
})
})
}
var startDate = Date.now();
AV.Promise.when(
timePromisefy(1),
timePromisefy(32),
timePromisefy(64),
timePromisefy(128)
)).then(function(r1,r2,r3,r4) {
console.log(new Date() - startDate);
})
var startDate = Date.now();
AV.Promise.when(
time
)
var query = new AV.Query("Comment");
query.equalTo("post",post);
query.find().then(function(results) {
var promise = [];
_.each( results, function(result) {
promises.push(result.destroy());
});
return AV.Promise.when(promises);
}).then(function() {
});
错误处理中返回所有遇到的错误信息,以数组形式提供。
AV.Promise.all
数组形式的输入, 错误处理, 而不是等所有promise 完成.
AV.Promise.all([
timerPromisefy(1),
timerPromisefy(32)
]).then( function(values) {
})
race方法
AV.Promise.race 方法按收一个 promise 数组接入,扔resolve 时或者reject
该函数会函回 resolve 或者reject
var p1 = new AV.Promise.as(1),
p2 = new AV.Promise.as(2),
p3 = new AV.Promise.as(3);
Promise.race([p1,p2,p3]).then(function(value) {
console.log(value);
})
var delay= function(millis) {
var promise = new AV.Promise();
setTimeout()function() {
pormise.resolove();
},millis);
return promise;
}
delay(100).then(function(){
})
AV.Promise.setPromisesAPLusCompiant(true);
process.on('uncaughtException');
AV.Promise.setDebugError(true);
Promise 让异步更优的更多相关文章
- 答应我,这次必须搞懂!痛点难点Promise。(小点心async/await,基于Promise的更优方案)
Promise 出现的原因 在 Promise 出现以前,我们处理一个异步网络请求,大概是这样: // 请求 代表 一个异步网络调用. // 请求结果 代表网络请求的响应. 请求1(function( ...
- Promise和异步编程
前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编 ...
- Promise与异步
不知道promise,大家现在用了吗?如果还不了解的话,今天就来对了-基础的了解起来- 正文从这开始- 接触过promise的的都知道它的应用场景和用途,Promise可以用来避免异步操作函数里的嵌套 ...
- Promise对象 异步编程
Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是 ...
- PHP日志扩展 SeasLog-1.6.8, 性能更优
SeasLog-1.6.8 发布了,性能更优. 改进日志: 1.6.8: 优化内存使用和性能,修复已知Bug. - Fixed issue #97 PHP5.* Cached Block. - Fix ...
- Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)
刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...
- ES6 Promise 让异步函数顺序执行
应用 ES6 的 内置对象 Promise, 让异步函数 按顺序执行的例子 如下: 上边 是四个用Promise 处理过的 异步执行的函数: fn1.fn2.fn3.fn4 下面,让其按顺序执行 如下 ...
- IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!
idea 2019.2 准备 idea 2019.2正式版是在2019年7月24号发布的,本篇文章,我将根据官方博客以及自己的理解来进行说明,总体就是:性能更好,体验更优,细节处理更完美! 支持jdk ...
- 编程思想转换&体验Lambda的更优写法和Lambda标准格式
编程思想转换做什么,而不是怎么做 我们真的希望创建一个匿名内部类对象吗?不,我们只是为了做这件事情而不得不创建一个对象. 我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓. 传递 ...
随机推荐
- Android color(颜色) 在XML文件和java代码中
Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...
- nandflash中oob、ecc分析
1.为何需要分析? 最近一直接触这类驱动,如果对它的原理不懂的话,驱动调试会很麻烦!!!!!! 2.ecc? nand的纠错能力,目前有1位.4位和8位,也就是说在512字节中如果是4位的ecc那就可 ...
- MapReduce 运行机制
Hadoop中的MapReduce是一个使用简单的软件框架,基于它写出来的应用程序能够运行在由上千个机器组成的大型集群上,并且以一种可靠容错并行处理TB级别的数据集. 一个MapReduce作业(jo ...
- urlconnection用法(转)
1.获取ip地址 package demo.net; import java.net.InetAddress; import java.net.UnknownHostException; /* * 获 ...
- jQuery实现页面滚动时顶部动态显示隐藏
http://www.jqcool.net/jquery-scroll.html 另外headroom.js也行:http://www.bootcss.com/p/headroom.js/
- vim字符串替换
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...
- $(document).ready(function(){});不执行
这里可能会有以下几种原因,请你挨个排查: 1.jqury的文件一定要引入1.js文件的引用路径不正确,特别是使用了命名空间,容易造成路径错误,使用绝对路径看是否成功 2.某一些函数使用错误,举个例子, ...
- iOS自动布局之autoresizingi
对于iOS的app开发者来说,不会像Android开发者一样为很多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,但是从设计模式上来说这不是好的做法.而且也还有一些问题,如iPhone5的适配, ...
- c# web 删除时弹出提示框
方法1: 在控件中增加属性 <asp:Button ID="btnSub" runat="server" Text="提交" oncl ...
- DataSet与DataTable基本用法
http://files.cnblogs.com/files/monkeyZhong/DataSetExample.rar 在设计数据库操作或者XML操作等表格数据时,我们难免要跟DataSet和Da ...