【发布时间】:2016-06-16 07:31:22
【问题描述】:
序言
我有一个想法:如果我通过将我的对象串在一起作为微服务来减少我的重复数据结构,我为什么不使用 Sails、nodejs 和 api 调用。这就是一切的开始。
问题定义
如何将动态数组发送到函数,对另一个微服务执行未知数量的 API 调用,然后将返回的值组合到单个对象中进行处理?
旅程
我找到了关于 q 或 bluebird 的资料。
我有一个函数(在sails 中),它返回一个JSON 数组中的用户电子邮件地址列表。
getUserInfo: function(opt, callback){
var https = require('https');
var options = {
hostname: opt.hostname || 'as.net.au',
port: opt.port || 443,
path: opt.path || '/developers',
method: opt.method || 'GET',
headers: opt.headers || {'Authorization': 'Basic ' + 'ThuperThecretKey'}
}
var req = https.request(options, function(res) {
var data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
//console.log('BODY: ' + chunk); //oh so chunky
data += chunk;
});
res.on('end', function() {
//console.log(data)
callback(null, data)
})
})
req.on('error', function(e) {
console.log('problem with request: ' + e.message)
callback(e) //error
})
req.end()
}
它会返回一组 JSON 数组中的电子邮件地址:
['dev1@thisplace.com','dev2@thisplace.com','dev3@someotherplace.com']
然后我将它放入一个名为“devs”的 json 对象中。
所以现在我想将这个数组传递给一个函数,让它为每个开发者执行一个 API 调用,并将结果添加到 json 对象或新对象中。我假设一个新的 devs 是一个数组而不是一个完整的对象。
互联网上的共识似乎是使用bluebird,但我正在努力解决我假设每个人都在努力解决的问题,什么变量被命名为什么,更新了哪个,如何将东西加载到变量中,它去了哪里,等等等等,我的头疼。入口处有些东西,我不确定是否应该去那里。
所以我在寻求帮助。有没有人有一个例子说明异步执行这些操作然后解析结果的最佳方式?
我已经够远了,可以看到一个很好的异步调用循环发送到我的 API(如下所示),但是如何在最后一个 then 函数中传入和读取变量?
它记录了“为 dev1@thisplace.com 执行承诺.....等等” 然后“devs”对象为空,“dev”对象如预期(每个电子邮件地址)。
但是我如何将我的 API 调用的输出传递回调用 json(或新的 json)?它如何维护和异步更新对象? 我假设在错误之后(潜在的占位符编号 1)会在 else 中出现一些东西。
类似:
promise.map(devs, function(dev) {
console.log('executing a promise for ' + dev)
MyCont.getUserInfo({'path': '/developers' + dev}, function (err,devs) {
if (err) {
console.log(err)
} else {
console.log ('devs: ' + devs)
console.log('dev: ' + dev)
//Potential placeholder number 1 -Some here that loads the returned value to the passed in or new array?
}
})
}).then(function() {
//Or maybe it goes here?
console.log("done");
});
【问题讨论】:
-
那个问题非常有趣(+1 表示逗逗有趣的骨头)但我们真的不希望在这里写出这样的问题(-1 表示随后的编辑工作) .谢谢!
标签: arrays json node.js promise bluebird