如何在内部具有多个异步函数的foreach循环中return数据

How to return data in foreach loop having multiple async functions inside

我正在使用 await 调用此函数并将数据存储在结果变量中。但是函数 returns 没有完成 foreach 循环。我怎样才能使这个函数 return 只有当 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;

}

尝试使用 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;
}

阅读 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);

并出现 STOCKS 未定义错误。

async/await 的工作方式而言,您的代码是正确的。原始代码的问题是,未定义 STOCKS 变量。我假设,它没有在其他任何地方定义。因此,按照预期进行以下工作。

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;

}