代码之家  ›  专栏  ›  技术社区  ›  Deepak Dev

如何在包含多个异步函数的foreach循环中返回数据

  •  0
  • Deepak Dev  · 技术社区  · 2 年前

    我使用wait调用这个函数,并将数据存储在结果变量中。但是函数返回时没有完成foreach循环。只有foreach循环结束时,我怎样才能使这个函数返回?

    let result = await prepareStocks(data);
    
    async function prepareStocks(incomingStocks) { 
        var stockCodes = incomingStocks.stocks.split(',');
        var stockPrices = incomingStocks.trigger_prices.split(',');
        var alertName = incomingStocks.alert_name;
        stockCodes.forEach(async(stocks, index) => {
    
            if (stockPrices[index] > 100) {
    
                var stockCodes = {
                    code: stocks,
                    price: stockPrices[index],
                    orderType: (urls.buy.includes(alertName) ? 'BUY' : 'WATCH'),
                    target: await setSellPrice(stockPrices[index], 1),
                    stopLoss: await setStopLoss(stockPrices[index], 1),
                }
                STOCKS.push(stockCodes);
            }
    
        });
        return STOCKS;
    
    }
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Brijesh Patel    2 年前

    尝试使用 Promise.all

    类似这样的东西=>

    let result = await prepareStocks(data);
    async function prepareStocks(incomingStocks) { 
        var stockCodes = incomingStocks.stocks.split(',');
        var stockPrices = incomingStocks.trigger_prices.split(',');
        var alertName = incomingStocks.alert_name;
    
    
        const STOCKS = await Promise.all(stockCodes.map(async (stocks, index) => {
            if (stockPrices[index] > 100) {
    
                var stockCodes = {
                    code: stocks,
                    price: stockPrices[index],
                    orderType: (urls.buy.includes(alertName) ? 'BUY' : 'WATCH'),
                    target: await setSellPrice(stockPrices[index], 1),
                    stopLoss: await setStopLoss(stockPrices[index], 1),
                }
                return stockCodes;
            }
        })
    
        return STOCKS;
    }
    
        2
  •  0
  •   Tamil Vendhan Kanagarasu    2 年前

    在阅读了async/await部分之后,我想知道async/await的使用方式没有问题; STOCKS 必须返回预期值。因此,我设置了一个如下的模拟&运行代码。

    async function setSellPrice(price) { return new Promise(function resolver(resolve) {setTimeout(function someTimeLater() { resolve(price)});}); }
    async function setStopLoss(price) { return new Promise(function resolver(resolve) {setTimeout(function someTimeLater() { resolve(price)});}); }
    const data = { stocks: 'A,B,C'. trigger_prices: '100,120,140', alert_name: 'XYZ' };
    let result = await prepareStocks(data);
    

    而且 股票 未定义错误。

    你的代码是正确的 async/await 作品原始代码的问题是 股票 变量未定义。我想,它在其他任何地方都没有定义。所以,按照预期做以下工作。

    let result = await prepareStocks(data);
    
    async function prepareStocks(incomingStocks) { 
        const STOCKS = [];
        var stockCodes = incomingStocks.stocks.split(',');
        var stockPrices = incomingStocks.trigger_prices.split(',');
        var alertName = incomingStocks.alert_name;
        stockCodes.forEach(async(stocks, index) => {
    
            if (stockPrices[index] > 100) {
    
                var stockCodes = {
                    code: stocks,
                    price: stockPrices[index],
                    orderType: (urls.buy.includes(alertName) ? 'BUY' : 'WATCH'),
                    target: await setSellPrice(stockPrices[index], 1),
                    stopLoss: await setStopLoss(stockPrices[index], 1),
                }
                STOCKS.push(stockCodes);
            }
    
        });
        return STOCKS;
    
    }