2015-12-07 189 views
1

我正在嘗試使用解析雲代碼並使用承諾來確保我消除了cals是異步的任何問題。我想查詢一個類,取回一個對象,建立一些JSON,然後查詢對象的某些關係(標籤,裁判),並將它們添加到JSON中以返回ExpressJS進行渲染。我粘貼的代碼不起作用,但我不明白爲什麼每次我回到項目中尋找下一個承諾。解析雲代碼承諾的問題

編輯:

//Return a single project 
Parse.Cloud.define('getProject', function(request, response) { 
    var projectUrl = request.params.projectUrl; 

    var project; 
    var projectsData = []; 

    var Projects = new Parse.Object("projects"); 
    var query = new Parse.Query(Projects); 
    query.equalTo("projectUrl", projectUrl); 
    query.find().then(function(projectsResult) { 
     console.log(projectsResult.length + " Projects returned"); 

     project = projectsResult[0]; 
     var projectData = { 
      "id": project.get("id"), 
      "title": project.get("title"), 
      "previewImage": project.get("previewImage"), 
      "longDescription": project.get("longDescription"), 
      "shortDescription": project.get("shortDescription"), 
      "visibleToPublic": project.get("visibleToPublic"), 
      "dateStart": project.get("dateStart"), 
      "dateEnd": project.get("dateEnd"), 
      updatedAt: project.get("updatedAt"), 
      projectStatus: project.get("projectStatus") 
     }; 

     projectsData.push(projectData); 
     console.log("Step 1. Projects Data: " + JSON.stringify(projectsData)); 

     var tagsQuery = project.relation('tags'); 
     return tagsQuery.query().find(); 
    }).then(function(tags) { 
     var tagsData = []; 
     for(var t = 0; t < tags.length; t++) { 
      var tagData = { 
       "tag": tags[t].get("tag"), 
      } 
      console.log("Tag Data: " + tagData); 
      tagsData.push(tagData); 
     } 
     projectsData[tags] = tagsData; 
     console.log("Step 2. Tags Data: " + JSON.stringify(tagsData)); 

     var refereesQuery = project.relation('referees'); 
     return refereesQuery.query().find(); 
    }).then(function(referees) { 
     var refereesData = []; 
     for(var r = 0; r < referees.length; r++) { 
      var refereeData = { 
       "name": referees[r].get("name"), 
       "role": referees[r].get("role"), 
       "emailAddress": referees[r].get("emailAddress"), 
       "phoneNumber": referees[r].get("phoneNumber"), 
       "linkedInUrl": referees[r].get("linkedInUrl"), 
      } 
      console.log("Referee Data: " + refereeData); 
      refereesData.push(refereeData); 
     } 
     projectsData[referees] = refereesData; 
     console.log("Step 3. Referees Data: " + JSON.stringify(refereesData)); 

     console.log("Everthing should be part of Projects Data here: " + JSON.stringify(projectsData)); 

     response.success(projectsData); 
    }, function(error) { 
     response.error("Error: " + error); 
    }); 
}); 

回答

0

有幾個問題:

  • 混亂和projectData之間projectsData
  • projectsData實際上不是必要的。
  • projectData需要在創建&後指定的三個地方使用(或應該使用)。
  • 在幾種情況下,.then()用於標準同步流就足夠了。清除不必要的.thens將有助於清理範圍問題。

做得比周圍洗牌碼多一點,我在下面抵達:

Parse.Cloud.define('getProject', function(request, response) { 
    var Projects = Parse.Object.extend("projects"); // with credit to @kRiZ 
    var query = new Parse.Query(Projects); 
    query.equalTo('projectUrl', request.params.projectUrl); 
    query.find().then(function(projectsResult) { 
     var project = projectsResult[0]; 
     var projectData = { 
      'id': project.get('id'), 
      'title': project.get('title'), 
      'previewImage': project.get('previewImage'), 
      'longDescription': project.get('longDescription'), 
      'shortDescription': project.get('shortDescription'), 
      'visibleToPublic': project.get('visibleToPublic'), 
      'dateStart': project.get('dateStart'), 
      'dateEnd': project.get('dateEnd'), 
      'updatedAt': project.get('updatedAt'), 
      'projectStatus': project.get('projectStatus') 
     }; 

     //Now make the tags query and the referees query in parallel. 
     var tagsPromise = project.relation('tags').query().find(); 
     var refereesPromise = project.relation('referees').query().find(); 

     // Aggregate the two promises with Parse.Promise.when(), and handle the responses. 
     return Parse.Promise.when(tagsPromise, refereesPromise).then(function(tags, referees) { 
      //Process the tags response 
      projectData.tags = tags.map(function(t) { 
       return { 
        'tag': t.get('tag') 
       }; 
      }); 
      //Process the referees response 
      projectData.referees = referees.map(function(r) { 
       return { 
        'name': r.get('name'), 
        'role': r.get('role'), 
        'emailAddress': r.get('emailAddress'), 
        'phoneNumber': r.get('phoneNumber'), 
        'linkedInUrl': r.get('linkedInUrl') 
       }; 
      }); 
      // Yay! 
      response.success(projectData); 
     }); 
    }).fail(function(error) { 
     response.error('Error: ' + error); 
    }); 
}); 

除了整體重排,唯一的重大變化是:

  • 使用Array#map()將數組映射到另一個數組。
  • 並行進行兩個查詢並使用Parse.Promise.when()來彙總這兩個承諾。
+0

這在fantasitcally @ Roamer-1888工作。現在我只需要找出如何查詢不同的類,並添加到我的數據的累積/ –

+0

馬克,如果第三查詢僅依賴於'promise',那麼我的模式應該很好地擴展,以適應它。只需添加另一個'var xxxxPromise = project.relation ...'語句,將'xxxxPromise'添加到'Parse.Promise.when(...)',並以與'tags'和' referees'。 –

+0

所以我想我遵循了你的建議,但沒有得到我期待的人口。我也嘗試鏈接承諾查詢更深,即 但也沒有工作。 我已經更新了我的代碼的跟進問題 http://stackoverflow.com/questions/34146245/returning-deeper-relations-in-parse-cloud-code-when-using-promises –

0

的問題似乎是與你的初始查詢。你正在嘗試使用子類,但是你的語法是錯誤的。

您的查詢應該開始像這樣:

var Projects = Parse.Object.extend("projects"); 
var query = new Parse.Query(Projects); 

編輯:

而且,你正在返回的對象,您應該返回承諾。下面 見代碼(未測試):

Parse.Cloud.define('getProject', function(request, response) { 
    var projectUrl = request.params.projectUrl; 
    var projectsData = []; 

    var Projects = Parse.Object.extend("projects"); 
    var query = new Parse.Query(Projects); 
    query.equalTo("projectUrl", projectUrl); 
    query.find().then(function(projectsResult) { 
     console.log(projectsResult.length + " Projects returned"); 

     var project = projectsResult[0]; 
     var projectData = { 
      "id": project.get("id"), 
      "title": project.get("title"), 
      "previewImage": project.get("previewImage"), 
      "longDescription": project.get("longDescription"), 
      "shortDescription": project.get("shortDescription"), 
      "visibleToPublic": project.get("visibleToPublic"), 
      "dateStart": project.get("dateStart"), 
      "dateEnd": project.get("dateEnd"), 
      updatedAt: project.get("updatedAt"), 
      projectStatus: project.get("projectStatus") 
     }; 

     projectsData.push(projectData); 
     console.log("Step 1. Projects Data: " + JSON.stringify(projectsData)); 

     // Removed the return from here 

     var tagsData = []; 
     console.log("Project Step 2: " + JSON.stringify(project)); 
     var tagsQuery = project.relation('tags'); 
     return tagsQuery.query().find(); 
    }).then(function(tags) { 
     for(var t = 0; t < tags.length; t++) { 
      var tagData = { 
       "tag": tags[t].get("tag"), 
      } 
      tagsData.push(tagData); 
     } 
     projectsData.tags = tagsData; 
     console.log("Step 2. Tags Data: " + JSON.stringify(tagsData)); 

     // Removed return from here 

     var refereesData = []; 
     var refereesQuery = project.relation('referees'); 
     return refereesQuery.find(); 
    }).then(function(referees) { 
     for(var r = 0; r < referees.length; r++) { 
      var refereeData = { 
       "name": referees[r].get("name"), 
       "role": referees[r].get("role"), 
       "emailAddress": referees[r].get("emailAddress"), 
       "phoneNumber": referees[r].get("phoneNumber"), 
       "linkedInUrl": referees[r].get("linkedInUrl"), 
      } 
      refereesData.push(refereeData); 
     } 
     projectData.referees =refereesData; 
     console.log("Step 3. Referees Data: " + JSON.stringify(refereesData)); 

     response.success(projectsData); 
    }, function(error) { 
     response.error("Error: " + error); 
    }); 
}); 

上使用子類中檢索數據見解析文檔here

+1

當關於解析雲代碼的所有最新消息是他們談論使用Promises但所有文檔都使用回調時,這是極其令人沮喪的。這是一個混雜的信息,很難找到有用的例子。我改變了上面的代碼,但仍然無法正常工作。我得到的錯誤是: ' 結果:TypeError:無法調用未定義的方法「關係」 ' –

+1

是的,他們的文檔沒有更新。錯誤很好,這意味着你的承諾正在發揮作用。該錯誤意味着你的對象是null(未定義)。 – kRiZ

+0

查看上面的更新。你正在返回實際的對象,應該返回承諾。代碼雖然未經測試,但應給出一個總體思路。 – kRiZ