在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是包的一部分。
答案 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,你可能不得不使用光纤。