2014-08-28 44 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