如何在内部具有多个异步函数的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;
}
我正在使用 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;
}