2015-02-11 13 views
0

使用Q/promises /異步函數時,從一個類方法返回一個值到另一個類方法的最佳方式是什麼?如何在使用Q/promise/asynchronous函數時從一個類方法返回一個值到另一個類方法?

具體來說,我有以下的地方,ClassOne.myMethod()將調用ClassTwo.test()來執行幾個異步任務(數據庫更新,文件寫入等)。我想要ClassTwo.test()返回一些東西(在本例中爲「FOUR」)。在使用承諾和異步調用時,我該怎麼做?

我這樣做是因爲我想讓ClassTwo成爲執行將由其他類調用的任務的非常通用的一組方法(因爲每次都不要重新發明方向盤)。

例如,

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

}; 
+0

您可以在解決承諾時傳遞值,如'deferred.resolve('something','else');' – adeneo 2015-02-11 00:07:54

+0

Thanks,Adeneo。除了下面的Mike之外,您的評論是我需要了解如何實現這一點的。非常感激。 – RT01 2015-02-11 07:59:36

回答

1

我認爲你正在尋找的東西像下面這樣。請注意,我已將所有對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()); 
+0

謝謝,邁克。這是我正在尋找的答案。您的迴應非常有幫助,及時且易於理解。 – RT01 2015-02-11 07:58:42

相關問題