Node.js 如何使用NodeJS解决forEach中的多个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

我在一个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)
        });
    })
现在,您正在“拒绝”每个响应。

我不确定“请求”是否正确,但使用“请求-承诺-本机”可以简化一些类似的事情

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)
  • 您不应该尝试与所有请求共享同一个options对象(这可能会导致问题,也可能不会导致问题)
  • 您需要在更高的范围内声明
    承诺
    ,该范围可与
    承诺一起使用。所有(承诺)
  • 以下是解决这些问题后的情况:

    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
    之外定义
    承诺
    我的印象是,只有当
    请求
    引发错误时,承诺才会被拒绝?