Вложенные запросы, возвращающие UNDEFINED с использованием базы данных javascript и parse.com

У меня есть два класса в моей базе данных синтаксического анализа, один из которых называется «TrebUser», а другой называется «UserImage», описанный ниже:

TrebUser
-------------------------------------------------------------- ------
| идентификатор объекта | имя | фамилия | изображение |

(строка) (строка) (строка) (UserImage ObjectId)

Изображение пользователя
------------------------------------
| идентификатор объекта | изображение | imagename |
(строка) (файл) (строка)

Для данного TrebUser я хочу отобразить профиль, который включает их имя, фамилию и показывает имя изображения (как только мне удастся отобразить имя изображения, я попытаюсь фактически отобразить изображение). Я пытаюсь использовать один запрос для получения TrebUser, а затем второй вложенный запрос или обещание (как я использовал ниже), чтобы получить имя изображения для этого пользователя, а затем вернуть это имя изображения туда, где я его напечатаю. экран. По какой-то причине оно всегда возвращается как неопределенное, хотя когда я использую всплывающее предупреждение, оно показывает имя просто отлично. Я думаю, что это как-то связано с асинхронным выполнением. Какие-нибудь мысли?

function getPhoto(i){

    var TrebUser = Parse.Object.extend("TrebUser");
    var queryTrebUser = new Parse.Query(TrebUser);

    var UserImage = Parse.Object.extend("UserImage");
    var queryUserImage = new Parse.Query(UserImage);


    queryTrebUser.find().then(function(results) {
        alert("Successfully retrieved " + results.length + "object");

        var object = results[i];
        var imageId = object.get('image').id;

        queryUserImage.equalTo("objectId", imageId);

        return queryUserImage.find();

    }).then(function(imageResults) {

        var object2 = imageResults[i];

        //this alert shows the image 'name' perfectly, however when i return the object2.get('name') it shows
        //up as undefined!
        alert("Successfully retrieved " + imageResults.length + " object with name " + object2.get('name'));
        return object2.get('name');

    }, function(error) {

        alert("Error: " + error.code + " " + error.message);

    });
}

person user2661279    schedule 09.08.2013    source источник


Ответы (1)


Вместо этого вы должны просто использовать метод .include(key), например.

var TrebUser = Parse.Object.extend("TrebUser");
var queryTrebUser = new Parse.Query(TrebUser);

queryTrebUser.include("image");

queryTrebUser.find().then(function(results) {
    alert("Successfully retrieved " + results.length + "object");

    var object = results[i];
    var image = object.get('image');
    var imageName = image.get('name');
});

Я бы очень поставил под сомнение несколько вещей, которые вы делаете, основываясь на предоставленном вами коде. Возможно, мне следует объяснить, что будет делать ваш текущий код (порядок будет меняться в зависимости от скорости сети):

  • вызов getPhoto (3)
  • создать асинхронный запрос, чтобы получить всех пользователей (по умолчанию ограничено 100 лучших) с обработчиком успеха, i (3) передается во внутреннюю область
  • вернуть undefined (в области видимости нет инструкции return)
  • ... (когда асинхронный метод возвращается с данными через несколько секунд) ...
  • получить 4-й элемент из результатов (массив на основе 0)
  • извлечь идентификатор изображения
  • построить запрос, используя find() ПРИМЕЧАНИЕ: следует просто использовать get(id), если вы знаете идентификатор
  • передать запрос как обещание следующему обработчику then()
  • ... (когда следующий асинхронный метод возвращается с данными через несколько секунд) ...
  • попробуйте получить 4-е элементы из массива, в котором должен быть только один элемент
  • попытаться получить свойства чего-то, что, насколько я понимаю, должно быть нулевым/неопределенным
  • вернуть строковое свойство из обещания, ужасно нарушив ситуацию
person Timothy Walters    schedule 14.08.2013