Попытка разрешить обещание API с помощью map () - PullRequest
0 голосов
/ 09 октября 2019

ОБНОВЛЕНИЕ: решено!

Единственное необходимое изменение - await вызова API для return, затем карта возвращалась с именами изображений и идентификаторами. Все еще пытаюсь преобразовать карту в массив, но этот вопрос для этого поста решен. Вот новая распечатка:

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)

Значения, похоже, присутствуют при отладке, но затем, когда я пытаюсь вернуть карту, она выводится как неопределенная. Несмотря на то, что карта выполняет цикл для получения каждого идентификатора (как видно из двух верхних операторов печати). Вот моя распечатка:

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> ]

Вот снимок экрана с идентификатором, имеющим значение, когда я наведите курсор на него в операторе возврата: enter image description here

В основномЯ пытаюсь выполнить вызов API с изображениями URL, затем API свяжет идентификатор с каждым лицом на изображении. Мне нужен вызов API, чтобы вернуть все эти идентификаторы. В этом случае это только 2 идентификатора. Как мне это сделать? В конце моего кода мне просто нужен массив этих идентификаторов. Вот и все. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Ваш 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 для массива, чтобы получить его значениякак массив.

0 голосов
/ 09 октября 2019

Я думаю, что проблема, с которой вы сталкиваетесь здесь в строке let id = response.faceId.

, id получает свое значение из response.faceId. Пожалуйста, проверьте, что faceId свойство присутствует в объекте ответа. Если он присутствует, код будет работать так, как вы ожидали.

...