2015-10-20 3 views
0

В функции сервера Parse он получает совпадения и профили. Из запроса, чтобы получить матчи другой функции вызывается для получения профилей от ид, но результат:Получение объекта Анализ из цикла

{"_resolved":false,"_rejected":false,"_reso resolvedCallbacks":[],"_rejectedCallbacks":[]} 

Главная Запрос:

mainQuery.find().then(function(matches) { 
_.each(matches, function(match) { 
     // Clear the current users profile, no need to return that over the network, and clean the Profile 


     if(match.get('uid1') === user.id) { 
      match.set('profile2', _processProfile(match.get('profile2'))) 
      match.unset('profile1') 
     } 
     else if (match.get('uid2') === user.id) { 
      var profileMatch = _getProfile(match.get('profile1').id); 
      alert(">>>"+JSON.stringify(profileMatch)); 

      match.set('profile1', _processProfile(match.get('profile1'))) 
      match.unset('profile2') 
     } 

})

функция для получения профиля info:

function _getProfile(id){ 

var promise = new Parse.Promise(); 



    Parse.Cloud.useMasterKey(); 

    var queryProfile = new Parse.Query(Profile); 

     return queryProfile.equalTo("objectId",id).find() 
     .then(function(result){ 

      if(result){ 
       promise.resolve(result); 
       alert("!!!!"+result); 
      } 

       else { 
      console.log("Profile ID: " + id + " was not found"); 
      promise.resolve(null); 

      } 

     }, 
     function(error){ 

      promise.reject(error) 
     }); 
     return promise;  
} 
+0

получение результата профиля за пределами совпадений контуров в порядке – aurny2420289

ответ

1

Просто нашел это немного поздно. Вероятно, вы перешли, но для будущих читателей: ключом к решению чего-то подобного является использование обещаний как возврат от небольших логических асинхронных (или иногда асинхронных, как в вашем случае) операций.

Вся функция _getProfile можно переформулировать:

function _getProfile(id){ 
    Parse.Cloud.useMasterKey(); 
    var queryProfile = new Parse.Query(Profile); 
    return queryProfile.get(id); 
} 

Поскольку он возвращает обещание, хотя, вы не называть это так:

var myProfileObject = _getProfile("abc123"); 
// use result here 

Вместо называть это так :

_getProfile("abc123").then(function(myProfileObject) { // use result here }); 

Зная, что нам нужно t o переработать цикл, который вызывает эту функцию. Основная идея заключается в том, что, поскольку цикл иногда дает обещания, нам нужно будет разрешить эти обещания в конце.

// return a promise to change all of the passed matches' profile attributes 
function updateMatchesProfiles(matches) { 
    // setup mainQuery 

    mainQuery.find().then(function(matches) { 
     var promises = _.map(matches, function(match) { 
     // Clear the current users profile, no need to return that over the network, and clean the Profile 

     if(match.get('uid1') === user.id) { 
      match.set('profile2', _processProfile(match.get('profile2'))); // assuming _processProfile is a synchronous function!! 
      match.unset('profile1'); 
      return match; 
     } else if (match.get('uid2') === user.id) { 
      var profileId = match.get('profile1').id; 
      return _getProfile(profileId).then(function(profileMatch) { 
       alert(">>>"+JSON.stringify(profileMatch)); 
       match.set('profile1', _processProfile(match.get('profile1'))) 
       match.unset('profile2'); 
       return match; 
      }); 
     } 
    }); 
    // return a promise that is fulfilled when all of the loop promises have been 
    return Parse.Promise.when(promises); 
} 
+0

Спасибо, я проверю его позже. Итак, мы должны поместить все обещания из цикла и профиля в качестве обещания тоже? – aurny2420289

+0

Не требуется, нет. То, как написано, функция принимает массив совпадений, делает что-то для всех (синхронно для некоторых, асинхронно для других) и возвращает обещание закончить все, что выполняется с элементами исходного массива, теперь измененными. Он также мог легко вернуть только те, которые были изменены асинхронно или даже вообще отсутствуют. – danh

Смежные вопросы