返回集中处理的回调

时间:2014-10-01 12:29:52

标签: javascript meteor coffeescript

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

这适用于Meteor app,其中fileA是app的一部分,fileB是包的一部分。

2 个答案:

答案 0 :(得分: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

这就是你所做的,所以我不确定我理解你的担忧。

答案 1 :(得分: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,你可能不得不使用光纤。