node.js - Promise.all().finally() 可以返回未解析的数据吗?
问题描述
我发现 Promise.all().finally() 的行为非常不寻常 - 看起来它在 map() 应用于此之前返回数据。
1. 从数据库接收的数据。
2. 在map() 中调用Google Maps API,应用于从数据库中检索的数据,并将Google API 调用的结果添加到对象属性“Distance”中。
3. 在 Promise.all() 中返回数据——接收到的数据没有新的属性。我不明白这怎么可能?
public static get = async (req: Request, res: Response) => {
const latitude = req.query.lat;
const longitude = req.query.long;
const pool = await new sql.ConnectionPool(CommonConstants.connectionString).connect();
const request = pool.request();
const result = await request.execute('SuppliersSP');
sql.close();
const rows = result.recordset.map(async (supplier) => {
const data = { origin: [latitude, longitude], destination: [supplier.Latitude, supplier.Longitude] };
const distance = await GetDistance(data) || 0;
Object.defineProperty(supplier, 'Distance', {
enumerable: true,
configurable: true,
writable: true,
value: distance
});
return supplier;
})
Promise.all(rows).finally(() => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.status(200).json(rows);
});
}
这是 GetDistance 函数:
import { Constants } from "./constants";
const https = require('https');
export function GetDistance(coords) {
const { origin, destination } = coords;
return new Promise((resolve, reject) => {
https.get(`${Constants.GoogleMapsUrl}?origins=${origin[0]},${origin[1]}
&destinations=${destination[0]},${destination[1]}
&key=${Constants.GoogleMapsApiKey}`, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
const distance = JSON.parse(data);
resolve(distance.rows[0].elements[0].distance.value);
});
}).on("error", (err) => {
reject("Error: " + err.message);
});
});
}
解决方案
更改.finally()
为.then()
.
推荐阅读
- sdk - pragma solidity - jpmorganchase cakeshop 中的编译错误
- python - 来自 pd.read_html DF[0] 格式的列表数据帧的连接列表
- azure - 包含的用户权限
- python - 有没有更快的方法将熊猫数据帧处理成大型 csv?
- angular - 在 Angular 应用程序之间共享导航
- python - SMC-Python 添加和删除列入黑名单的 IP
- node.js - 如何使用 GeoFirestore 从 Firestore 实际查询数据?
- node.js - 无法让这个 NPM 命令在 Mojave 上运行
- node.js - 如何划分维基百科文件并用于 NodeJS
- reactjs - CSS :empty 伪选择器结合 :after 伪元素