如何在 Meteor 中批量运行异步调用?

Posted

技术标签:

【中文标题】如何在 Meteor 中批量运行异步调用?【英文标题】:How can I run asynchronous calls in batches in Meteor? 【发布时间】:2015-03-08 21:45:07 【问题描述】:

我正在尝试在 Meteor 中异步进行多个 API 调用。我想同时运行一些功能,然后当它们完成后,能够使用所有这些结果来做其他事情。下面概述了我的意思:

Http.get(something)
Http.get(something else)
Http.get(something more)
Http.get(something even else more)

我希望能够同时运行这些,然后在它们完成后,一次访问所有数据。在 Meteor 中执行此类操作的最佳方法是什么?

【问题讨论】:

这是在客户端还是服务器上运行? 可能与上一个问题重复,请在此处查看我的答案:***.com/questions/25940806/… @DavidWeldon。它正在服务器上运行 感谢@saimeunt,这正是我想要的。有人评论了您的回答,即 wrapAsync 可以帮助替换它。那可能吗。如果是这样,那将如何运作? 完美。感谢您的帮助 【参考方案1】:

至于让它们并行运行并检测最后一个返回的时间,我不知道。如果您不介意串行运行它们,那些 Http.get 遵循节点回调样式,因此您应该能够使用 wrapAsync() 函数将其转换为伪同步,这意味着您将获得回调的结果作为每次调用的返回值(尽管他们将使用 Futures 所以他们不会阻塞)。您可以查看 Meteor.wrapAsync 或 Arunoda 的 async 包,了解将异步方法转换为同步的方法(我过于简化了,但效果相同)。这是您可以执行的操作的示例:

syncGet = Meteor.wrapAsync(Http.get)

res1 = syncGet(url1, options1)
res2 = syncGet(url2, options2)
res3 = syncGet(url3, options3)
res4 = syncGet(url4, options4)

// Do something with the above results here

如果您还不熟悉,这里有一本关于 Meteor 中同步和异步函数的精彩读物: https://www.discovermeteor.com/blog/understanding-sync-async-javascript-node/

除此之外,您还可以将每个调用嵌套在前一个的回调中,这看起来很恶心,并且仍然具有串行运行的效果。

注意:如果您严格从服务器运行此程序,请参阅 Adjuke 的回答,在这种情况下会更简单一些。

【讨论】:

否决票是因为您的回答忽略了有关异步调用的问题并回答了其他问题。您在第一行中用“我不知道”承认了这一点,这很好,但它仍然显示为最佳答案,可能会导致某人误入歧途。 @user728291 唯一的其他答案完全相同。为什么不在你的时候也对他们投反对票呢?我的回答仍然很大程度上解决了问题的主要部分,即等待结果回来。我假设他希望调用是异步的,这样它们就不会阻塞事件循环。好吧,当你使用 Meteor.wrapAsync 时,代码仍然是异步运行的!它只是使用 Future 来获取稍后放回事件循环的回调返回。意味着没有阻塞,而代码仍然“异步”运行...... ...代码只是看起来是同步的。我当然没有忽略关于异步调用的问题。这不像 OP 对他们想要实现的目标非常具体。我给出的答案肯定适合他所描述的困境中的某些人。【参考方案2】:

我假设你想在Meteor.methods做一些事情

对于您的情况,您可以在流星中使用http 包。

http 包的使用有两个方面——它可以作为同步或异步,这取决于你如何使用它。

首先使用meteor add http将包添加到您的项目中

那么。 如果你使用 as

result = Meteor.http.get("http://headers.jsontest.com/")
console.log('output of http.get here ' + result)

并且没有将第二个参数作为“异步回调函数”传递给http.get,它表现为同步调用,即get的输出将在result变量中

你正在像这样传递第二个参数

  result = Meteor.http.get("http://ip.jsontest.com/", function(err, res)
    console.log('output of http.get here ' + JSON.stringify(res))
  )

它将表现为异步调用,即http.get的结果将在回调内部res而不是result变量中

在你的情况下,使用第一个像

  result2 = Meteor.http.get("http://headers.jsontest.com/")
  result3 = Meteor.http.get("http://date.jsontest.com/")
  console.log("result 2 here " + result2)
  console.log("result 3 here "+ result3)

现在,有了result2result3,你可以做任何你想做的事情

为了您的参考,我在meteorpad中创建了示例-检查一下-http://meteorpad.com/pad/E8w3xRFor9rfX7YMX/sample-***-example

查看someMethod 内的common.js 文件

您可以使用 -Meteor.call('someMethod') 从客户端调用此方法并检查服务器控制台上的输出

您需要从这里访问上述应用程序-http://app-tedmqdye.meteorpad.com/ 您可以从右窗格中获取它

【讨论】:

流星垫对我不起作用。当我从浏览器控制台输入Meteor.call('someMethod') 时,我收到一个错误Error invoking Method 'someMethod': Method not found [404] @LarryMaccherone 您可能需要从应用程序 url 使用而不是流星垫 url- 这是 url-app-tedmqdye.meteorpad.com 很遗憾,您不能从客户端执行此操作。 Meteor 文档声明客户端需要回调。您需要在客户端同步包装它以实现此结果。详情请看我的回答。 @ajduke,谢谢。我以前从未使用过流星垫。我想我会开始更频繁地使用它。仅单击最新的链接本身也无法正常工作,您必须单击第一个链接并启动并运行该链接,然后从第二个链接进行调用。一旦您了解了其运行方式的范式,就有意义了。再次感谢。 @krose 好的,您可能适合客户端,但我在帖子中提到我假设 OP 想要从服务器端进行多次调用(很明显,将在像这样的服务器端),特别是来自Meteor.methods

以上是关于如何在 Meteor 中批量运行异步调用?的主要内容,如果未能解决你的问题,请参考以下文章

Meteor 同步方法调用

Ajax 的异步调用和批量修改

如何运行多个异步函数然后执行回调?

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?

在 T4 文本模板中调用异步方法?

asyncio + pycurl + BytesIO 异步批量调用url请求