尝试使用map()解决API的承诺

时间:2019-10-09 04:38:03

标签: node.js promise async-await

更新:已解决!

唯一需要做的更改是将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的屏幕截图: enter image description here

基本上,我尝试用URL图像进行API调用,然后API将ID与图像中的每个面孔相关联。我需要API调用以返回所有这些ID。在这种情况下,只有2个ID。我该怎么做呢?在代码末尾,我只需要一个包含这些ID的数组。就这样。谢谢。

2 个答案:

答案 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属性。如果存在,则代码将按预期工作。