更新:已解决!
唯一需要做的更改是将API的await
调用到return
,然后返回带有图像名称和ID的地图。仍在尝试将地图转换为数组,但此问题已解决。这是新的打印输出:
1 face detected from image Family1-Son1.jpg with ID 98091e1e-bc8d-4c93-a850-a115684a6e6e
Family1-Son1.jpg
1 face detected from image Family1-Dad3.jpg with ID f94360f5-feb3-4d14-816f-7d854fc0b34c
Family1-Dad3.jpg
[ { '0': 'F',
'1': 'a',
'2': 'm',
'3': 'i',
'4': 'l',
'5': 'y',
'6': '1',
'7': '-',
'8': 'D',
'9': 'a',
'10': 'd',
'11': '3',
'12': '.',
'13': 'j',
'14': 'p',
'15': 'g',
id: 'f94360f5-feb3-4d14-816f-7d854fc0b34c' },
{ '0': 'F',
'1': 'a',
'2': 'm',
'3': 'i',
'4': 'l',
'5': 'y',
'6': '1',
'7': '-',
'8': 'S',
'9': 'o',
'10': 'n',
'11': '1',
'12': '.',
'13': 'j',
'14': 'p',
'15': 'g',
id: '98091e1e-bc8d-4c93-a850-a115684a6e6e' } ]
[ <2 empty items> ]
[]
我在这里尝试了许多不同的方法,无法使它们起作用。这是我最近来的一个。我正在尝试调用一个API,但在数组中的每个项目上。我无法定期执行此操作,因此有很多原因。因此有人说使用array.map()函数而不是循环。我到这为止了:
const IMAGE_BASE_URL = 'https://csdx.blob.core.windows.net/resources/Face/Images/'
let sourceImageFileNames = ['Family1-Dad3.jpg', 'Family1-Son1.jpg']
// Detect faces in the source image array, then get their IDs
let sourcefaceMap = await Promise.all(sourceImageFileNames.map(async (imageName) => {
// Returns a Promise<DetectedFace[]>
await client.face.detectWithUrl(IMAGE_BASE_URL + imageName)
.then((faces) => {
console.log(`${faces.length} face detected from image ${imageName} with ID ${faces[0].faceId}`)
let id = faces[0].faceId
return { ...imageName, id }
}).catch((err) => {
console.log(`No face detected in: ${sourceImageFileNames[0]}.`)
throw err;
})
}))
let values = Object.values(sourcefaceMap)
console.log(values)
// Create an array to store the source face IDs
var sourceFaceIds = new Array(sourceImageFileNames.length)
console.log(sourceFaceIds)
let ids = sourceFaceIds.filter((id)=> {
return id != null;
})
console.log(ids)
调试时值似乎在其中,但是当我尝试返回映射时,它以未定义的形式打印出来。即使地图确实完成了循环以获取每个id的工作(如前两个打印语句所示)。 这是我的打印输出:
VERIFY
1 face(s) detected from image Family1-Dad3.jpg with ID f94360f5-feb3-4d14-816f-7d854fc0b34c
1 face(s) detected from image Family1-Son1.jpg with ID 98091e1e-bc8d-4c93-a850-a115684a6e6e
[ undefined, undefined ]
[ <2 empty items> ]
[ <2 empty items> ]
当我将鼠标悬停在return语句中时,这是具有值的id的屏幕截图:
基本上,我尝试用URL图像进行API调用,然后API将ID与图像中的每个面孔相关联。我需要API调用以返回所有这些ID。在这种情况下,只有2个ID。我该怎么做呢?在代码末尾,我只需要一个包含这些ID的数组。就这样。谢谢。
答案 0 :(得分:1)
您的map
回调没有return
,它只是等待。使用
const values = await Promise.all(sourceImageFileNames.map(imageName => {
// now *really* returns a Promise<DetectedFace[]>
return client.face.detectWithUrl(IMAGE_BASE_URL + imageName)
.then(faces => {
console.log(`${faces.length} face detected from image ${imageName} with ID ${faces[0].faceId}`)
let id = faces[0].faceId
return { imageName, id }
}).catch((err) => {
console.log(`No face detected in: ${sourceImageFileNames[0]}.`)
throw err;
})
}));
console.log(values);
我也很确定您不想将imageName
字符串散布到一个对象中,也不需要在数组上调用Object.values
来获取其值作为数组
答案 1 :(得分:0)
我认为您在let id = response.faceId
行遇到的问题。
id正在从response.faceId获取其值,请确保检查响应对象中是否存在faceId
属性。如果存在,则代码将按预期工作。