如何使用 NodeJS 解决 forEach 中的多个 GET 请求
How to resolve multiple GET requests in a forEach using NodeJS
我在 JSON 文件中有许多股票代码,我想用它们发送多个 GET 请求以获取该股票的价格。我遇到的问题是如何并行发送它们以及如何解决它们。
这是我试过的代码:
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)
});
})
现在,您 "rejecting" 每次回复。
我不确定 "request",但使用 "request-promise-native" 您可以简化一些类似这样的事情。
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' 文档建议 'request-promise-native'。如果您打算使用 promises,您可能想要切换。通常最好避免将回调和承诺链组合在一起。
您的代码走在正确的道路上。
- 如果确实有错误,你只需要调用
rej(err)
- 您不应尝试与所有请求共享相同的选项对象(这可能会或可能不会导致问题)
- 您需要在可以与
Promise.all(promises)
一起使用的更高范围内声明 promises
:
这是解决这些问题后的样子:
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 模块更易于使用,因为它已经包含一个承诺包装器,并且使用 .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);
});
我在 JSON 文件中有许多股票代码,我想用它们发送多个 GET 请求以获取该股票的价格。我遇到的问题是如何并行发送它们以及如何解决它们。
这是我试过的代码:
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)
});
})
现在,您 "rejecting" 每次回复。
我不确定 "request",但使用 "request-promise-native" 您可以简化一些类似这样的事情。
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' 文档建议 'request-promise-native'。如果您打算使用 promises,您可能想要切换。通常最好避免将回调和承诺链组合在一起。
您的代码走在正确的道路上。
- 如果确实有错误,你只需要调用
rej(err)
- 您不应尝试与所有请求共享相同的选项对象(这可能会或可能不会导致问题)
- 您需要在可以与
Promise.all(promises)
一起使用的更高范围内声明promises
:
这是解决这些问题后的样子:
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 模块更易于使用,因为它已经包含一个承诺包装器,并且使用 .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);
});