Promise 讓異步更優

每一個異步方法都返回一個Promise數組

更優雅.promise

then方法異步

每個Promise  都有一個叫then 的方法,函數

接受一對callback    被解決時調用,resolve,post

被拒絕   rejected 遇到錯誤orm

obj.save().then(function(obj){ci

}, 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);

相關文章
相關標籤/搜索