对异步操作进行排序,然后是 onResult 调用 [英] Sequencing async operations followed by onResult call
问题描述
小提琴:http://jsfiddle.net/smartdev101/eLxxpjp3/
在 asyncAction 函数调用中,已经创建了一个 promise 来对两个异步操作进行排序,getRecords
和 getTotal
然后是对 onResult(data)<的最终调用/code> 成功或
onFail(info)
异常.
Inside asyncAction function call, a promise has been created to sequence two async operations, getRecords
and getTotal
followed by a final call to onResult(data)
on success or onFail(info)
in case of exception.
如何在完成两个异步操作后获取 onResult 调用?
how to get onResult call upon completion of two async operations?
asyncAction: function(url, params, resultFunction, faultFunction) {
puremvc.asyncproxy.AsyncProxy.prototype.asyncAction.call(this, resultFunction, faultFunction);
if(!params.id) { //get master
var queryString = this.url.parse(url, true).query;
var offset = queryString.offset ? Number(queryString.offset) : 0;
var limit = queryString.limit ? Number(queryString.limit) : 20;
var data = {rows: null, total: null};
var self = this;
this.getRecords(data, offset, limit)
.then(function(data){return self.getTotal(data)})
//.fail(function(error){self.onFault(error)})
.done(function(data){self.onResult(data)})
} else { //get detail
this.getDetail(params.id);
}
},
getRecords: function(data, offset, limit) {
console.log('get records');
var defer = this.q.defer();
this.connection.query("SELECT title, name, company FROM speaker LIMIT ? OFFSET ?", [limit, offset], function(error, rows, fields){
console.log('get records done');
data.rows = rows;
defer.resolve(data);
//defer.reject("earlier");
});
return defer.promise;
},
getTotal: function(data) {
console.log('get total');
var defer = this.q.defer();
this.connection.query("SELECT * FROM speaker", function(error, rows, fields) { //SQL_CALC_FOUND_ROWS later
data.total = rows.length;
console.log('get total done');
defer.resolve(data);
//defer.reject("just like that");
});
return defer.promise;
},
onResult: function(data) {
console.log('on result');
puremvc.asyncproxy.AsyncProxy.prototype.onResult.call(this, data);
},
onFault: function(info) {
puremvc.asyncproxy.AsyncProxy.prototype.onFault.call(this, info);
}
推荐答案
这似乎可以简化.似乎您只想同步执行这些异步操作.如果返回promise,链中的原promise将成为新promise.最后的失败将捕获第一个被拒绝的承诺.
It seems like this could be simplified. It seems like you just want these async operations to be performed synchronously. If you return the promise, the original promise in the chain will become the new promise. The final fail will catch the first promise to be rejected.
asyncAction: function(url, params, resultFunction, faultFunction) {
puremvc.asyncproxy.AsyncProxy.prototype.asyncAction.call(this, resultFunction, faultFunction);
if(!params.id) { //get master
var queryString = this.url.parse(url, true).query;
var offset = queryString.offset ? Number(queryString.offset) : 0;
var limit = queryString.limit ? Number(queryString.limit) : 20;
var data = {rows: null, total: null};
var self = this;
this.getRecords(data, offset, limit)
.then(function(data) {
return self.getTotal(data);
})
.then(this.onResult.bind(this))
.fail(this.onFault);
} else { //get detail
this.getDetail(params.id);
}
},
getRecords: function(data, offset, limit) {
console.log('get records');
var defer = this.q.defer();
this.connection.query("SELECT title, name, company FROM speaker LIMIT ? OFFSET ?", [limit, offset], function(error, rows, fields){
console.log('get records done');
data.rows = rows;
defer.resolve(data);
//defer.reject("earlier");
});
return defer.promise;
},
getTotal: function(data) {
console.log('get total');
var defer = this.q.defer();
this.connection.query("SELECT * FROM speaker", function(error, rows, fields) { //SQL_CALC_FOUND_ROWS later
data.total = rows.length;
console.log('get total done');
defer.resolve(data);
//defer.reject("just like that");
});
return defer.promise;
},
onResult: function(data) {
console.log('on result');
puremvc.asyncproxy.AsyncProxy.prototype.onResult.call(this, data);
},
这篇关于对异步操作进行排序,然后是 onResult 调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!