gpt4 book ai didi

javascript - NodeJS : How to handle a variable number of callbacks run in parallel and map their responses to requests?

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:07 26 4
gpt4 key购买 nike

作为自学更多有关 Node js 的练习,我开始使用 aws-sdk 为 SimpleDB (sdb) 制作一个基本的 CRUD REST 服务器。

一切都运行得很顺利,直到我找到了读取域的功能。 aws-sdk 有两个用于此目的的函数: listDomainsdomainMetadata 。 listDomains 返回 sdb 域名数组。 domainMetadata 将返回有关某个域的其他统计信息,但一次仅返回一个域的统计信息。结果中不包含域名。

我的脚本正在运行 listDomains 并在 JSON 响应中返回一个数组,效果很好。我想让我的 api readDomains 函数更加雄心勃勃,并让它在同一个 api 调用中返回所有域的元数据。毕竟,同时运行少量的domainMetadata调用才是 Node 的异步io应该发挥作用的地方。

问题是我无法弄清楚如何运行可变数量的调用,对所有调用使用相同的回调,将每个domainMetadata调用的结果与其域名相匹配(因为它是异步的并且不能保证它们)按请求的顺序返回)并告知所有元数据请求何时完成,以便我可以发送最终响应。将我的问题区域放入代码中是:

domain.receiveDomainList = function(err, data){
var domainList = [];

for(var i=0; i<data.DomainNames.length; i++){
sdb.domainMetaData({"DomainName":data.DomainNames[i]},domain.receiveMetadata);
// alternatively: domainList.push({"DomainName":data.DomainNames[i]});
}
// alternatively:
// async.map(domainList, sdb.domainMetadata, domain.receiveMetadata)

console.log(domainList);
}

domain.receiveMetadata = function (err, data){
// I figure I can stash the results one at a time in an array in the
// parent scope but...

// How can I tell when all of the results have been received?

// Since the domainname used for the original call is not returned with
// the results how do I tell what result matches what request?
}

根据我对异步自述文件的阅读,映射函数至少应该通过一些黑魔法将元数据响应与请求相匹配,但它会导致 Node 在 aws 同步库中爆炸,并出现错误“没有方法'makeRequest” '”。

有什么方法可以实现这一切:请求并行运行、请求与响应匹配以及知道我何时收到所有内容?

最佳答案

使用.bind()您可以设置上下文或 this 值,并为绑定(bind)函数提供前导默认参数。

下面的示例代码纯粹是为了展示如何使用 .bind() 向响应回调添加其他上下文。

在下面的代码中,.bind 用于:

  • domainResults 对象设置为 receiveMetaData 回调的上下文
  • 将当前域名作为参数传递给回调

domainResults 对象用于:

  • 跟踪第一个请求中收到的姓名数量
  • 跟踪已完成的计数(在元数据请求的每个回调中递增)
  • 跟踪列表中的错误和成功响应
  • 提供完整的回调

完全未经测试的代码仅用于说明目的:

domain.receiveDomainList = function(err, data) {
// Assuming err is falsey
var domainResults = {
nameCount: data.DomainNames.length,
completeCount: 0,
list: {},
complete: function() {
console.log(this.list);
}
};

for (var i = 0; i < data.DomainNames.length; i++) {
sdb.domainMetaData({ "DomainName": data.DomainNames[i] },
domain.receiveMetadata.bind(domainResults, data.DomainNames[i]));
}
}

domain.receiveMetadata = function(domainName, err, data) {
// Because of .bind, this === domainResults
this.completeCount++;
this.list[domainName] = data || {error: err};

if(this.completeCount === this.nameCount) {
this.complete();
}
}

关于javascript - NodeJS : How to handle a variable number of callbacks run in parallel and map their responses to requests?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18753388/

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