2014-06-14 71 views
2

我有兩個表在解析 存儲器和位置與關係一對一,但指針位於位置表(指針)Parse.com - Promises - 將父對象與其他一對一對象作爲屬性返回

我需要的是十有跳躍和限制,每個內存讀取所有的回憶10與位置對象atach屬性

現在我有這樣的:

var _ = require('underscore.js'); 
Parse.Cloud.define("feed", function(request, response) { 
    var memories = Parse.Object.extend("Memories"); 
    var memoriesQuery = new Parse.Query(memories); 

    memoriesQuery.skip(0);//request.params.skip); 
    memoriesQuery.limit(10);//request.params.limit); 
    memoriesQuery.descending("createdAt"); 
    memoriesQuery.include("group"); 

    var parsedResults = []; 

    memoriesQuery.find().then(function(memories) { 

     var promise = Parse.Promise.as(); 
     _.each(memories, function(memory) { 

      promise = promise.then(function() { 
       var locations = Parse.Object.extend("Locations"); 
       var locationsQuery = new Parse.Query(locations); 
       locationsQuery.equalTo("memory", memory); 

       var subPromise = Parse.Promise(); 

       locationsQuery.first().then(function(location) { 
        memory["location"] = location; 
        console.log(JSON.stringify(memory) + " ........ " + memory["location"]); 
        console.log("============="); 
        parsedResults.push(memory); 
        subPromise.resolve(memory); 
       }); 
       return subPromise ; 
      }); 
      console.log("-----------"); 
      console.log("Promise:" +promise.toString()); 
     }); 

     return promise; 

    }).then(function(){ 
     response.success(parsedResults); 
    }); 
}); 

我不知道該怎麼做..超過10個小時的嘗試。 我感謝任何幫助!

+0

但指針在位置表(指針)中...那麼你應該查詢'位置'與包含字段名稱包含指向內存。 –

+0

我需要這種方式,因爲位置是我需要加入的表格之一,但我還有兩個一對多的,如果我得到.first()的解決方案,很容易使.find()。這就是我需要的一種方法來解決這個問題 –

回答

2

終於解決了! 也許它會幫助別人。

解決方案:

var _ = require('underscore.js'); 
var memoriesResult = []; 
Parse.Cloud.define("feed", function(request, response) { 
    var promises = []; 
    var promise = findMemories(); 
    promise.then(function(memories){ 
     console.log("success promise!!"); 
     _.each(memories, function (memory) { 
      console.log("each"); 
      promises.push(findLocation(memory)); 
     }); 
     return Parse.Promise.when(promises); 
    }).then(function(){ 
     console.log("Finish"); 
     response.success(memoriesResult); 
    }, function(error){ 
     console.error("Promise Error: " + error.message); 
     response.error(error); 
    }); 
}); 

function findMemories(){ 
    console.log("Enter findMemories"); 

    var memories = Parse.Object.extend("Memories"); 
    var memoriesQuery = new Parse.Query(memories); 

    memoriesQuery.skip(0);//request.params.skip); 
    memoriesQuery.limit(10);//request.params.limit); 
    memoriesQuery.descending("createdAt"); 
    memoriesQuery.include("group"); 

    var promise = new Parse.Promise(); 

    memoriesQuery.find().then(function(memories) { 
     console.log("Memories found!"); 
     promise.resolve(memories); 
    }, function(error) { 
     promise.reject(error); 
    }); 
    return promise; 
} 

function findLocation(memory) { 
    console.log("Enter findLocation"); 

    var locations = Parse.Object.extend("Locations"); 
    var locationsQuery = new Parse.Query(locations); 
    locationsQuery.equalTo("memory", memory); 

    var promise = new Parse.Promise(); 

    locationsQuery.first().then(function(location) { 
     console.log("Location found"); 
     memoriesResult.push({"memory": memory, "location" : location}); 
     promise.resolve(memory); 
    }, function(error) { 
     promise.reject(error); 
    }); 
    return promise; 
} 
+0

我強烈建議不要在循環內部做一個'find()',那真的不會很好地擴展。你會執行很多查詢(如果'request.params.limit == 10',你將執行11個查詢) –

0

做一些實驗後,我想出了以下要求和解決方案:

  • 您可以通過Memories項的頁面要頁的時間,整理通過他們的createdAt
  • 你想Locations與每個內存相關
  • 你是有限的b y中的事實關係Locations->Memories

第一步是定義查詢回憶:

var memoryQuery = new Parse.Query('Memories'); 
memoryQuery.skip(request.params.skip); 
memoryQuery.skip(request.params.limit); 
memoryQuery.descending('createdAt'); 

現在,您可以使用此查詢來限制Locations對象返回。如果你的鏈接都是正確設置你會得到10個記錄:

var locationQuery = new Parse.Query('Locations'); 
// limit to only the page of Memory items requested 
locationQuery.matchesQuery('memory', memoryQuery); 
// include the Memory pointer's data 
locationQuery.include('memory'); 
var memoriesResult = []; 
locationQuery.find().then(function(locations) { 
    var result = _.map(locations, function(location) { 
     memory: location.get('memory'), 
     location: location 
    }); 
    response.success(result); 
}, function(error) { 
    response.error(error); 
}); 

上述唯一的問題是,我不知道返回的記錄的順序,所以你可能要重新排序他們在返回之前。這是非常簡單的,但下劃線庫。

無論頁面大小如何,這將導致2個查詢。

+0

是真的。但除了位置表至少是一對一的,我還有兩個是一對多的,而不是.first()方法,我使用.find(),在那裏我不能使用你的方法。感謝您的時間回答! –

相關問題