使用async/await批量获取商品报错:XXX.then is not a function
问题分析与解决
你的问题出在map返回的是Promise数组,而不是单个Promise,数组本身没有.then()方法,所以才会报then is not a function的错误。
修正步骤
- 用
Promise.all()包装map返回的Promise数组,它会等待所有异步请求完成后,返回一个包含所有结果的数组。 - 处理结果时,要注意每个结果都是单个商品请求返回的
products对象,需要遍历这些对象,再提取每个对象里的products数组数据。
修正后的代码
let d = [ "butter", "mais", "bread" ]; // 批量获取所有商品,用Promise.all等待全部完成 Promise.all(d.map(async function(f) { const products = await ah.product().getProductsFromName(f, { sort: ProductSortOptions.PriceAsc }); return products; })).then(function(allResults) { // allResults是一个数组,每个元素是单个商品请求返回的products对象 const responseTitles = []; allResults.forEach(result => { // 遍历每个结果里的products数组,提取需要的字段 result.products.forEach(product => { responseTitles.push({ "title": product.title, "brand": product.brand }); }); }); res.json({ prod: responseTitles }); }).catch(function(err) { // 加错误捕获,避免应用崩溃,方便调试 console.error('批量获取商品出错:', err); res.status(500).json({error: '获取商品失败'}); });
额外优化(用async/await简化)
如果你的外层函数是async的,还可以用更简洁的写法:
let d = [ "butter", "mais", "bread" ]; try { const allResults = await Promise.all(d.map(async f => { return await ah.product().getProductsFromName(f, { sort: ProductSortOptions.PriceAsc }); })); const responseTitles = allResults.flatMap(result => result.products.map(product => ({ title: product.title, brand: product.brand })) ); res.json({prod: responseTitles}); } catch (err) { console.error('批量获取商品出错:', err); res.status(500).json({error: '获取商品失败'}); }
关键细节
map里的async函数会让每个迭代都返回一个Promise,所以得到的是Promise数组,必须用Promise.all()统一处理。- 加上
catch块可以捕获异步错误,避免应用直接崩溃,方便你查看错误信息调试。 flatMap可以代替嵌套的forEach,更简洁地把二维数组转成一维,提取所有商品的title和brand。
内容的提问来源于stack exchange,提问作者I try so hard but I cry harder
相关产品推荐
相关产品推荐

