Как извлечь 3 записи из хранилищ и поместить их в dbResult, используя обещание соединения - PullRequest
0 голосов
/ 04 октября 2018

Как использовать обещание объединения при извлечении 3 записей и помещении их в dbResult?В настоящее время у меня есть одна запись для извлечения, например, следующий код:

 req.oracleMobile.storage.getById(registry.getIncidentPhotoStorageName(), incident_id + '_01', { sync: true }).then(
            function (result) {
                base64data = result.result;
                base64data = JSON.parse(base64data);
                dbResult.photo = base64data.image;

                res.status(result.statusCode).send(dbResult);
    },
            function (err) {
               dbResult.photo = imageData.uploadPhotoIcon;
                //ignore no photo and send db result
                res.status(200).send(dbResult);
            }
        );

Я хочу получить 3 записи и добавить их как dbResult.photo2 = base64data.image;используя обещание присоединиться.Я попытался "вернуть обещание. Join (retrieve1, retrieve2, retrieve3);".это не работаетЭто мой код ...

function getIncident(req, res) {
getIncidentRow(req).then(
    function (dbResult) {
        var incident_id = dbResult.id;

        const join = require('promise-join');
        return join(req.oracleMobile.storage.getById(registry.getIncidentPhotoStorageName(), incident_id + '_01',  { sync: true }).then(
            function (result) {
                base64data = result.result;
                base64data = JSON.parse(base64data);
                dbResult.photo = base64data.image;
                //res.status(result.statusCode) .send(dbResult);                                 
            },
            function (err) {
                //ignore no photo and send db result
                res.status(200).send(dbResult);
            }
        ) ,req.oracleMobile.storage.getById(registry.getIncidentPhotoStorageName(), incident_id + '_02',  { sync: true }).then(
            function (result) {
                base64data = result.result;
                base64data = JSON.parse(base64data);
                dbResult.photo2 = base64data.image;
               // res.status(result.statusCode).send(dbResult);                 
            },
            function (err) {  
                //ignore no photo and send db result
                res.status(200).send(dbResult);
            }
        ) ,req.oracleMobile.storage.getById(registry.getIncidentPhotoStorageName(),  incident_id + '_03',  { sync: true }).then(
            function (result) {
                base64data = result.result;
                base64data = JSON.parse(base64data);
                dbResult.photo3 = base64data.image;
                res.status(result.statusCode).send(dbResult);                              
            },
            function (err) {             
                //ignore no photo and send db result
                res.status(200).send(dbResult);
            }
        ), function (result) {res.status(result.statusCode).send(dbResult)}
        ); 
    }
);

}

1 Ответ

0 голосов
/ 05 октября 2018

Теперь, когда я вижу, вы используете promise-join, а не Bluebirds Promise.join, что делает ваш код почти тривиальным

const join = require('promise-join');

function getIncident(req, res) {
    getIncidentRow(req).then(dbResult => {
        var incident_id = dbResult.id;
        const getItem = suffix => req.oracleMobile.storage.getById(registry.getIncidentPhotoStorageName(), incident_id + suffix,  { sync: true })
            .then(result => {
                let base64data = result.result;
                base64data = JSON.parse(base64data);
                return base64data.image;
                // or just ... return JSON.parse(result.result).image;
            });

        return join({
            photo: getItem('_01'), 
            photo2: getItem('_02'), 
            photo3: getItem('_03')
        })
        .then(({result, errors}) => {
            Object.assign(dbResult, result);
            res.status(200).send(dbResult);
        });
    });
}

обещание объединения обрабатывает ошибки, поэтому в .then({result, errors}) => { получает два объекта

result === {
    photo: /* resolved value of getItem('_01') */
    photo2: /* resolved value of getItem('_02') */
    photo3: /* resolved value of getItem('_03') */
}

и

errors === {
    photo: /* rejected value of getItem('_01') */
    photo2: /* rejected value of getItem('_02') */
    photo3: /* rejected value of getItem('_03') */
}

, т. Е. Если разрешить photo, в результате будет свойство photo, но не с ошибками и т. Д. Для photo2 и photo3

Теперь, поскольку ваш исходный код просто игнорировал любые отклонения фотографий, это прекрасно

Object.assign(dbResult, result)

Это все, что вам нужно, чтобы назначить любые разрешенные фотографии для dbResult

...