gpt4 book ai didi

javascript - meteor - 在返回之前同步多个异步查询?

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:17 25 4
gpt4 key购买 nike

所以我有一个 Meteor 方法应该告诉服务器向 3rd 方 API 发送多个 API 请求,然后将这些查询的结果组合成一个数组,返回给客户端。

但是,我似乎找不到让服务器等到所有 API 查询完成后再返回结果的方法。

代码的同步版本,只是一个接一个地获取数据 API 调用,是这样的:

Meteor.methods({
fetchData: function(APILinks) {
var data = [];
APILinks.forEach(function(APILink) {
var items = HTTP.get(APILink).content.items;
items.forEach(function (item) {
data.push(item);
});
});
return items;
}
});

此同步代码有效。但是,我还没有找到使 API 请求异步的好方法。我最接近的解决方案是重新定义方法以仅返回一个 API 请求的结果,然后让客户端循环遍历每个 API 链接并为每个链接调用该方法。但是,有没有一种方法可以将所有这些请求包装到一个很好的方法中,该方法仅在所有 API 请求完成时返回?

最佳答案

您必须使用 HTTP.get 的异步版本并使用 Future 收集结果。

我编了一个简单的例子,使用 setTimeouts 来模拟 HTTP 请求,这样你就可以理解原理了,我建议你从这段代码开始,把虚拟的 setTimeout 替换成您的 HTTP 获取请求。

该示例是一个测试 服务器方法,它以多个任务 (n) 作为参数,然后启动 n 个任务,每个任务在索引秒内计算其索引的平方。

// we use fibers which is a dependency of Meteor anyway
var Future = Npm.require("fibers/future");

Meteor.methods({
test: function(n) {
// build a range of tasks from 0 to n-1
var range = _.range(n);
// iterate sequentially over the range to launch tasks
var futures = _.map(range, function(index) {
var future = new Future();
console.log("launching task", index);
// simulate an asynchronous HTTP request using a setTimeout
Meteor.setTimeout(function() {
// sometime in the future, return the square of the task index
future.return(index * index);
}, index * 1000);
// accumulate asynchronously parallel tasks
return future;
});
// iterate sequentially over the tasks to resolve them
var results = _.map(futures, function(future, index) {
// waiting until the future has return
var result = future.wait();
console.log("result from task", index, "is", result);
// accumulate results
return result;
});
//
console.log(results);
return results;
}
});

在浏览器控制台中输入 > Meteor.call("test",3,function(error,result){console.log(result);});。这将在 3 秒后输出 [0,1,4]

在您的服务器控制台中,这将输出:

// immediately :
launching task 0
launching task 1
launching task 2
// after 1 second :
result from task 0 is 0
// after 2 seconds :
result from task 1 is 1
// after 3 seconds :
result from task 2 is 4
[ 0, 1, 4 ]

HTTP.get 异步版本在 Meteor 文档中有详细说明:

http://docs.meteor.com/#http_call

如果您想更好地理解整个 Future 概念,请参阅纤维文档:

https://github.com/laverdet/node-fibers

关于javascript - meteor - 在返回之前同步多个异步查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com