每个异步方法都返回一个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 让异步更优的更多相关文章

  1. 答应我,这次必须搞懂!痛点难点Promise。(小点心async/await,基于Promise的更优方案)

    Promise 出现的原因 在 Promise 出现以前,我们处理一个异步网络请求,大概是这样: // 请求 代表 一个异步网络调用. // 请求结果 代表网络请求的响应. 请求1(function( ...

  2. Promise和异步编程

    前面的话 JS有很多强大的功能,其中一个是它可以轻松地搞定异步编程.作为一门为Web而生的语言,它从一开始就需要能够响应异步的用户交互,如点击和按键操作等.Node.js用回调函数代替了事件,使异步编 ...

  3. Promise与异步

    不知道promise,大家现在用了吗?如果还不了解的话,今天就来对了-基础的了解起来- 正文从这开始- 接触过promise的的都知道它的应用场景和用途,Promise可以用来避免异步操作函数里的嵌套 ...

  4. Promise对象 异步编程

    Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是 ...

  5. PHP日志扩展 SeasLog-1.6.8, 性能更优

    SeasLog-1.6.8 发布了,性能更优. 改进日志: 1.6.8: 优化内存使用和性能,修复已知Bug. - Fixed issue #97 PHP5.* Cached Block. - Fix ...

  6. Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)

    刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...

  7. ES6 Promise 让异步函数顺序执行

    应用 ES6 的 内置对象 Promise, 让异步函数 按顺序执行的例子 如下: 上边 是四个用Promise 处理过的 异步执行的函数: fn1.fn2.fn3.fn4 下面,让其按顺序执行 如下 ...

  8. IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!

    idea 2019.2 准备 idea 2019.2正式版是在2019年7月24号发布的,本篇文章,我将根据官方博客以及自己的理解来进行说明,总体就是:性能更好,体验更优,细节处理更完美! 支持jdk ...

  9. 编程思想转换&体验Lambda的更优写法和Lambda标准格式

    编程思想转换做什么,而不是怎么做 我们真的希望创建一个匿名内部类对象吗?不,我们只是为了做这件事情而不得不创建一个对象. 我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓. 传递 ...

随机推荐

  1. MySQL Replication主从复制

    MySQL Replication:NySQL复制,MySQL的复制默认为异步工作模式   mysql的复制功能是mysql内置的,装上它之后就具备了这个功能,而mysql复制是mysql实现大规模高 ...

  2. [置顶] Codeforces Round #198 (Div. 1)(A,B,C,D)

    http://codeforces.com/contest/341 赛后做的虚拟比赛,40分钟出了3题,RP爆发. A计数问题 我们可以对每对分析,分别对每对<a, b>(a走到b)进行统 ...

  3. 只有在配置文件中或 Page 说明会 enableSessionState 至 true 时刻,能够使用会话状态。另外,还要确保应用程序配置 // 段包含 System.Web.SessionSta

    首先,弄清楚我们的目的,我的目标是验证用户登录.那是,Session["userName"]!=null 在ok该 起初,我是这么写的,结果给出,提示如果上述错误标题,在调查的很长 ...

  4. Redhat 官方Performance_Tuning_Guide

    https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Gui ...

  5. GNU GRUB version 0.97 (630K lower /2053824K upper memory)

    昨天把老板的IBM X61笔记本拿过来多系统,结果本以为很容易,直接ghost,结果悲剧发生啦,开机之后提示GNU GRUB version 0.97 (630K lower /2053824K up ...

  6. 关于a标签的链接的表现形式

    target属性:self在自身标签页里打开 blank在新标签页中打开 1.  链接到其它地址位置.html文档等 <a href="1.html"></a&g ...

  7. SQL Server中的20个系统变量

    1.@@CONNECTIONS返回自上次启动 Microsoft SQL Server以来连接或试图连接的次数.示例:下面的示例显示了到当前日期和时间为止试图登录的次数.SELECT GETDATE( ...

  8. JS,JQuery杂谈

    JS返回页面: JS返回前一个页面,经常看到有人用window.history.go(-1)这种方法  这种放的确可以返回,也仅仅只是返回,返回的页面信息却没有刷新.也有人用windows.histo ...

  9. ORA-01653:表空间扩展失败的问题

    以下内容来源于ORA-01653:表空间扩展失败的问题   今天发现,原来设备的数据表空间只有5M,已经满了,上网去找发现要进行扩展空间. 一.脚本修改方式: ----查询表空间使用情况---使用DB ...

  10. 一个Socket数据处理模型

    Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问 ...