【发布时间】:2014-12-20 14:20:08
【问题描述】:
小提琴:http://jsfiddle.net/smartdev101/eLxxpjp3/
在 asyncAction 函数调用中,已创建一个 Promise 来对两个异步操作进行排序,getRecords 和 getTotal,然后在成功时最终调用 onResult(data) 或在异常情况下调用 onFail(info)。
两个异步操作完成后如何调用 onResult?
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);
}
【问题讨论】:
-
你有什么问题?
-
请帮助获取 onResult(data),我得到的数据为 null
-
@AaronDufour 我已经编辑了问题
-
这是使用 Promise 的糟糕方式。您的异步操作(例如
getRecords())应该创建、返回和解决它们自己的promise,而不是对传入的defer 进行操作。然后您可以从.then()处理程序返回该promise,以便按顺序链接操作。另外,给定的 defer/promise 只能使用一次,因此您不能对getRecords()和getTotal()使用相同的 defer,这也是他们应该创建并返回自己的 promise 的原因。 -
@jfriend00 感谢您的批评,这就是我正在寻找的,在当前上下文中使用承诺的好方法,我想要的只是
data{}被传递到链上,getRecords填充rows字段,然后填充getTotal填充total字段,完成后调用onResult(data),您能否在使用最佳实践的同时重写上述内容。
标签: javascript node.js promise q