zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    java基础(4)--javadoc文档与命令
    java基础(3)--pulic class与class的区别
    java基础(2)--main方法讲解
    java基础(1)--注释
    shell 测试文件状态运算符
    shell 算术运算符
    linux free命令详解
    shell 基本语法
    linux vim编辑器优化
    linux shell介绍
  • 原文地址:https://www.cnblogs.com/yushunwu/p/5034712.html
Copyright © 2011-2022 走看看