使用 Q/promises/asynchronous 函数时,如何 return 从一个 class 方法到另一个方法的值?
How do you return a value from one class method to another when using Q/promises/asynchronous functions?
在使用 Q/promises/asynchronous 函数时,将一个 class 方法的值 return 转换为另一个 class 方法的最佳方法是什么?
具体来说,我有以下内容,其中 ClassOne.myMethod() 将调用 ClassTwo.test() 来执行多个异步任务(数据库更新、文件写入等)。我想要 ClassTwo.test() 到 return 一些东西(在这个例子中,"FOUR")。使用 promises 和异步调用时我该怎么做?
我这样做是因为我希望 ClassTwo 是一组非常通用的方法,用于执行将由其他 classes 调用的任务(以免每次都重新发明轮子)。
例如,
var myClass = new ClassTwo();
ClassOne.prototype.myMethod = function(myClass) {
console.log('Returns: ', myClass.test());
};
ClassTwo.prototype.test = function() {
var one = function() {
var deferred = Q.defer();
console.log('ONE');
deferred.resolve();
return deferred.promise;
};
var two = function() {
var deferred = Q.defer();
console.log('TWO');
deferred.resolve();
return deferred.promise;
};
var three = function() {
var deferred = Q.defer();
console.log('THREE');
deferred.resolve();
return 'FOUR';
};
return one()
.then(two)
.then(three);
};
我认为您正在寻找类似以下的内容。请注意,我已将所有对 deferred.resolve() 的调用包装到异步函数的回调中(在本例中为 process.nextTick),因为这将是一个更现实的用例,然后在返回它之前解析承诺,并且是的,我假设你会用你的异步任务做什么。您还声明了一个变量 'myClass' 并使用相同的标识符作为 'myMethod' 的函数参数。我认为这不是您真正想要做的,所以我在下面的示例中进行了更改.
var ClassTwo = function() {};
var ClassOne = function() {};
var Q = require('q');
ClassOne.prototype.myMethod = function(myClass) {
myClass.test().then(function(result) { // now test returns a promise
console.log('returns '+ result); // that we call .then() on
});
};
ClassTwo.prototype.test = function() {
var one = function() {
var deferred = Q.defer();
console.log('ONE');
process.nextTick(function() { deferred.resolve()});
return deferred.promise;
};
var two = function() {
var deferred = Q.defer();
console.log('TWO');
process.nextTick(function() { deferred.resolve()});
return deferred.promise;
};
var three = function() {
var deferred = Q.defer();
console.log('THREE');
process.nextTick(function() { deferred.resolve('FOUR')});
return deferred.promise;
};
return one()
.then(two)
.then(three)
};
(new ClassOne()).myMethod(new ClassTwo());
在使用 Q/promises/asynchronous 函数时,将一个 class 方法的值 return 转换为另一个 class 方法的最佳方法是什么?
具体来说,我有以下内容,其中 ClassOne.myMethod() 将调用 ClassTwo.test() 来执行多个异步任务(数据库更新、文件写入等)。我想要 ClassTwo.test() 到 return 一些东西(在这个例子中,"FOUR")。使用 promises 和异步调用时我该怎么做?
我这样做是因为我希望 ClassTwo 是一组非常通用的方法,用于执行将由其他 classes 调用的任务(以免每次都重新发明轮子)。
例如,
var myClass = new ClassTwo();
ClassOne.prototype.myMethod = function(myClass) {
console.log('Returns: ', myClass.test());
};
ClassTwo.prototype.test = function() {
var one = function() {
var deferred = Q.defer();
console.log('ONE');
deferred.resolve();
return deferred.promise;
};
var two = function() {
var deferred = Q.defer();
console.log('TWO');
deferred.resolve();
return deferred.promise;
};
var three = function() {
var deferred = Q.defer();
console.log('THREE');
deferred.resolve();
return 'FOUR';
};
return one()
.then(two)
.then(three);
};
我认为您正在寻找类似以下的内容。请注意,我已将所有对 deferred.resolve() 的调用包装到异步函数的回调中(在本例中为 process.nextTick),因为这将是一个更现实的用例,然后在返回它之前解析承诺,并且是的,我假设你会用你的异步任务做什么。您还声明了一个变量 'myClass' 并使用相同的标识符作为 'myMethod' 的函数参数。我认为这不是您真正想要做的,所以我在下面的示例中进行了更改.
var ClassTwo = function() {};
var ClassOne = function() {};
var Q = require('q');
ClassOne.prototype.myMethod = function(myClass) {
myClass.test().then(function(result) { // now test returns a promise
console.log('returns '+ result); // that we call .then() on
});
};
ClassTwo.prototype.test = function() {
var one = function() {
var deferred = Q.defer();
console.log('ONE');
process.nextTick(function() { deferred.resolve()});
return deferred.promise;
};
var two = function() {
var deferred = Q.defer();
console.log('TWO');
process.nextTick(function() { deferred.resolve()});
return deferred.promise;
};
var three = function() {
var deferred = Q.defer();
console.log('THREE');
process.nextTick(function() { deferred.resolve('FOUR')});
return deferred.promise;
};
return one()
.then(two)
.then(three)
};
(new ClassOne()).myMethod(new ClassTwo());