2014-10-01 91 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,则可能必须使用光纤。