Node.js 如何使用NodeJS解决forEach中的多个GET请求
我在一个JSON文件中有很多股票代码,我想用它来发送多个GET请求,以获取该股票的价格。我面临的问题是如何并行发送它们,以及如何解决它们 以下是我尝试过的代码:Node.js 如何使用NodeJS解决forEach中的多个GET请求,node.js,promise,es6-promise,node-request,Node.js,Promise,Es6 Promise,Node Request,我在一个JSON文件中有很多股票代码,我想用它来发送多个GET请求,以获取该股票的价格。我面临的问题是如何并行发送它们,以及如何解决它们 以下是我尝试过的代码: const stocks = require('./stocks.json') var request = require("request"); var stockTickers = stocks.map(x => x.stockopediaTicker) stockTickers.forEach(ticker
const stocks = require('./stocks.json')
var request = require("request");
var stockTickers = stocks.map(x => x.stockopediaTicker)
stockTickers.forEach(ticker => {
var promises = []
var options = {
method: 'GET',
url: 'https://www.stockopedia.com/ajax/get_prices/' + ticker + '/'
};
let todaysQuote = new Promise(function (res, rej) {
request(options, function (error, response, body) {
rej(error)
res(body)
});
})
promises.push(todaysQuote)
});
Promise.all(promises)
.then((results) => {
console.log(results)
}).catch(err => console.log(err))
您应该检查是否有错误,只有在出现错误时才检查
rej
:
let todaysQuote = new Promise(function (res, rej) {
request(options, function (error, response, body) {
if(error) {
return rej(error)
}
res(body)
});
})
现在,您正在“拒绝”每个响应。我不确定“请求”是否正确,但使用“请求-承诺-本机”可以简化一些类似的事情
const stocks = require('./stocks.json');
const request = require('request-promise-native');
const parseStocks = (stocks)=>Promise.all(stocks.map(requestQuote));
const requestQuote = ({stockopediaTicker})=>{
const options = {
method: 'GET',
url: `https://www.stockopedia.com/ajax/get_prices/${stockopediaTicker}/`
};
return request(options)
}
parseStocks(stocks).then(console.log).catch(console.log)
通常情况下,我不会在回答中建议更改依赖项,但在本例中,“请求”文档建议使用“request-promise-native”。如果你打算使用承诺,你可能会想要转换。避免将回调和承诺链组合在一起通常是最佳实践 您使用代码的路径是正确的
rej(err)
承诺
,该范围可与承诺一起使用。所有(承诺)
:const stocks = require('./stocks.json')
const request = require("request");
let promises = [];
let stockTickers = stocks.map(x => x.stockopediaTicker);
stockTickers.forEach(ticker => {
let todaysQuote = new Promise(function (res, rej) {
let options = {
method: 'GET',
url: 'https://www.stockopedia.com/ajax/get_prices/' + ticker + '/'
};
request(options, function (error, response, body) {
if (error) {
rej(error);
} else {
res(body);
}
});
})
promises.push(todaysQuote)
});
Promise.all(promises)
.then((results) => {
console.log(results);
}).catch(err => console.log(err))
request-promise模块使用起来更简单,因为它已经包含了一个promise包装器,而且使用
.map()
来积累承诺数组可能更容易
const stocks = require('./stocks.json')
const rp = require("request-promise");
Promise.all(stocks.map(x => {
let options = {
method: 'GET',
url: 'https://www.stockopedia.com/ajax/get_prices/' + x.stockopediaTicker + '/'
};
return rp(options);
})).then(results => {
console.log(results);
}).catch(err => {
console.log(err);
});
var promissions=[]
在promission的作用域中定义。所有都无权访问。尝试在forEach
之外定义承诺
我的印象是,只有当请求
引发错误时,承诺才会被拒绝?