2014-10-01 50 views
1

在的fileA,我可以做返回集中處理的回調

@someAPI = SomeAPI() 
@someAPI.getUser '123' 

然後在FILEB

class SomeAPI 

    constructor: (options = {}) -> 
    unless @ instanceof SomeAPI 
     return new SomeAPI(options) 

    getUser: (id) -> 
    someAPI.get 'users/show', { 'id': id }, (err, data, res) -> 
     if data 
     console.log data.name 

,但有一些方法可以有回調返回,所以我可以做的處理中的fileA?

的fileA僞

... 

processUser: (id) -> 
    @someAPI.getUser id, (err, data, res) -> 
    if data 
     console.log data.name 

processUser '123' 

FILEB僞

... 

getUser: (id) -> 
    return someAPI.get 'users/show', { 'id': id }, (err, data, res) 

。這是一個流星應用,在那裏的fileA是應用程序的一部分,包的FILEB一部分。

+0

這是在客戶端還是服務器上? – user3374348 2014-10-01 13:27:43

+0

全部在服務器上。 – jiku 2014-10-01 15:02:10

回答

1

你爲什麼不考慮其他方法並將回調傳遞給fileB?

getUser: (id, callback) -> 
    return someAPI.get 'users/show', { 'id': id }, callback 

然後在你的應用程序代碼,通過回調來執行結果本地處理的參數:

processUser: (id) -> 
    @someAPI.getUser id, (err, data, res) -> 
    if data 
     console.log data name 

這是你做了什麼,所以我不知道我理解你的關心。

+0

謝謝,效果很好。我是一般的回調新手,所以缺少一些基礎知識。 ^^ – jiku 2014-10-01 13:02:28

+0

除了回調結構不同之外呢?即如果在返回它之前必須在getUser方法中做一些修補。 – jiku 2014-10-01 13:07:44

+1

'getUser'只是一些api調用的包裝器,它只需要參數和回調,所以我不確定在'getUser'中可以合理地做些什麼修補,在調用'getUser'之前最好不會發生什麼,在api調用者的上下文中...如果你想從我這裏得到更好的答案,請用一個明確的例子編輯你的問題。 – saimeunt 2014-10-01 13:20:41

1

由於您在服務器上,因此您可以使用光纖以同步方式寫入此內容。例如,使用期貨:

# fileB 
Future = Npm.require("fibers/future") 

class SomeAPI 
    constructor: # ... 
    getUser: (id) -> 
    # Create a Future object 
    fut = new Future() 

    # Fire off an API call; when it finishes we store the result in 
    # the Future object 
    someAPI.get 'users/show', { 'id': id }, (err, data, res) -> 
     if err 
     fut.throw(err) 
     else 
     fut.return([data, res]) 

    # Wait for the Future to resolve and return the value we stored in it 
    return fut.wait() 

# Usage in fileA 
# This is synchronous. If an error occurred, you will get an exception 
[data, res] = @someApi.getUser(id) 
console.log(data.name) 

如果您曾想用Meteor方法調用API,則可能必須使用光纖。