jtr*_*ans 3 javascript json asynchronous node.js
我遇到了似乎是Node JS初学者和异步请求的传统问题.
我有一个由用户生成的未知数量的URL,随后存储在我的Node JS服务器上的数组中.Node JS服务器必须遍历这些URL,依次向每个URL发出请求.它必须按顺序执行,并且必须等待每个响应才能转到下一个URL(当发出新请求时).最终结果应该是所有响应(恰好是JSON)的有序集合,很好地存储在一起作为JSON对象,然后可以在准备好时将其发送回客户端.
我想我应该使用asyncNodeJS库,我已经用它needle来发出请求了.
URLs = ["http://a", "http://s", "http://d"];
async.eachSeries(URLs, function (URL, callback) { ..... });
Run Code Online (Sandbox Code Playgroud)
我不清楚如何使用async来确保Needle请求已经完成,并在转移到下一个URL请求之前相应地存储该响应.以下是我的Needle请求的示例.
needle.get(URL, options, function(error, response, body){ ... });
Run Code Online (Sandbox Code Playgroud)
对整个问题的部分或完整解决方案是受欢迎的.
Esa*_*ija 10
有了承诺,你可以用:
var Promise = require("bluebird");
var get = Promise.promisify(needle.get, needle);
var URLs = ["http://a", "http://s", "http://d"];
var current = Promise.fulfilled();
Promise.map(URLs, function (URL) {
current = current.then(function () {
return get(URL);
});
return current;
}).map(function(responseAndBody){
return JSON.parse(responseAndBody[1]);
}).then(function (results) {
console.log(results);
}).catch(function (e) {
console.error(e);
});
Run Code Online (Sandbox Code Playgroud)
作为奖励,当网站具有无效的json或响应错误消息/空体时,您的服务器不会崩溃.手写时,你需要手动尝试捕捉,但承诺处理两种错误catch().由于URL是由用户提供的,因此如果您不向非承诺代码添加手动try-catch,它们可以轻松地对您的服务器执行操作.
| 归档时间: |
|
| 查看次数: |
5309 次 |
| 最近记录: |