每一個異步方法都返回一個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);