2014-08-28 15 views
0

我在listsQuery上遇到問題,所有事情都發送到瀏覽器。我知道我需要一個承諾或在那裏,但我的嘗試迄今不成功。幫幫我!Parse.com查詢在事實後執行

function processNavigation(navigation) { 
var nav = []; 
_.each(navigation, function(navItems) { 
    var navProperties = { 
     name: navItems.get("Name"), 
     longName: navItems.get("LongName"), 
     icon: navItems.get("Icon"), 
     url: navItems.get("Url"), 
     module: navItems.get("Module"), 
     runScript: navItems.get("RunScript"), 
     sortOrder: navItems.get("SortOrder") 
    }; 

    switch (navItems.get("Module")) { 
     case "lists": 
      var listsQuery = new Parse.Query("ListItems"); // This should return back! But it's async? Needs promise? 
      listsQuery.ascending("SortOrder"); 
      listsQuery.find().then(
       function(results) { 
        var list = []; 
        _.each(results, function(listItems) { 
         var listProperties = { 
          name: listItems.get("Name"), 
          subName: listItems.get("Subname"), 
          sortOrder: listItems.get("SortOrder") 
         }; 
        }); 
        list.push(listProperties); 
        navProperties["source"] = list; 
       }, 
       function() { 
        res.send('error'); 
       } 
      ); 
      break; 

     default: 
      navProperties["source"] = null; 
      break; 
    } 

    nav.push(navProperties); 
}); 

res.send(nav); 
} 

回答

0

這應該給你一些東西繼續下去,我不知道它是否會工作,但它應該顯示你的概念。

您需要做的是創建一個promise數組,因爲它看起來像是對數組中的每個項目執行查詢,並且因爲查詢需要一些時間,所以在查詢完成之前發送響應。然後,您評估承諾數組並只在他們解決時纔將您的響應發回。

我建議你把你的邏輯分成幾個函數,因爲它有點難以遵循。

看看在parallel promises section

function processNavigation(navigation) { 
    var nav = []; 
    var promises = [] 

     _.each(navigation, function(navItems) { 
      var navProperties = { 
       name: navItems.get("Name"), 
       longName: navItems.get("LongName"), 
       icon: navItems.get("Icon"), 
       url: navItems.get("Url"), 
       module: navItems.get("Module"), 
       runScript: navItems.get("RunScript"), 
       sortOrder: navItems.get("SortOrder") 
      }; 

      switch (navItems.get("Module")) { 
       case "lists": 
        promises.push((function(navProperties){ 
         var listsQuery = new Parse.Query("ListItems"); // This should return back! But it's async? Needs promise? 
         listsQuery.ascending("SortOrder"); 
         listsQuery.find().then(
          function(results) { 
           var list = []; 
           _.each(results, function(listItems) { 
            var listProperties = { 
             name: listItems.get("Name"), 
             subName: listItems.get("Subname"), 
             sortOrder: listItems.get("SortOrder") 
            }; 
           }); 
           list.push(listProperties); 
           navProperties["source"] = list; 
           promise.resolve(); 
          }, 
          function() { 
           promise.reject(); 
           res.send('error'); 
          } 
         ); 
        })(navProperties)) 

        break; 

       default: 
        navProperties["source"] = null; 
        break; 
      } 

      nav.push(navProperties); 
     }); 


     Parse.Promise.when(promises).then(function(){        
      res.send(nav); 
     }) 

    } 
+0

我嘗試使用上面的代碼,但它並沒有停止對查詢仍然。我修改了代碼以刪除開關,使其更易於閱讀,但仍然沒有成功。 – boxmatic 2014-08-29 20:44:47