作为自学更多关于 node js 的练习,我开始使用 aws-sdk 为 SimpleDB (sdb) 制作一个基本的 CRUD REST 服务器。
一切都运行顺利,直到我得到一个读取域的函数。为此,aws-sdk 有两个函数:listDomains和domainMetadata。listDomains 返回一个 sdb 域名数组。domainMetadata 将返回有关域的其他统计信息,但一次仅返回一个域的统计信息。结果中不包括域名。
我的脚本正在运行 listDomains 并在 JSON 响应中返回一个数组就好了。我想让我的 api readDomains 函数更加雄心勃勃,并让它在同一个 api 调用中返回所有域的元数据。毕竟,同时运行少量 domainMetadata 调用是节点的异步 io 应该发挥作用的地方。
问题是我不知道如何运行可变数量的调用,对所有调用使用相同的回调,将每个 domainMetadata 调用的结果与它的 domainName 匹配(因为它是异步的,并且不能保证返回它们被请求的顺序)并告诉所有元数据请求何时完成,以便我可以发送最终响应。将我的问题区域放入代码中:
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?
}
根据我对异步自述文件的阅读,map 函数至少应该通过一些黑魔法将元数据响应与请求匹配,但它会导致节点在 aws 同步库中爆炸,并出现错误“没有方法‘makeRequest’”。
有什么办法可以做到:请求并行运行,请求与响应匹配,并且知道我什么时候收到了所有东西?