【发布时间】:2015-06-16 03:48:34
【问题描述】:
这篇文章的主题是:我的解决方案对于大查询返回来说太慢了。
我有一个 Web Api 通过调用 localhost:9090/api/invetories?id=1 提供如下所示的 REST 结果:
[
{
"inventory_id": "1",
"film_id": "1",
"store_id": "1",
"last_update": "2/15/2006 5:09:17 AM"
},
{
"inventory_id": "2",
"film_id": "1",
"store_id": "1",
"last_update": "2/15/2006 5:09:17 AM"
}
]
由于我的 WebAPI 没有为我的 JSON 响应提供根密钥,我制作了一个 RESTSerializer,如下所示。
export default DS.RESTSerializer.extend({
extract:function(store,primaryType,payload,id,requestType){
var typeName = primaryType.typeKey;
var data = {};
data[typeName] = payload; // creating root
payload = data;
return this._super(store,primaryType,payload,id,requestType)
}
});
当它运行时,我收到以下错误消息:Assetion failed: You must include an 'id' for inventory in an object passed to 'push'
如您所见,这些对象没有id 属性,所以我发现Ember RESTSerializer 的默认行为迫使我自己编写。
好的,这就是我不确定我的解决方案是否正确的地方。我返回的inventory_id 是独一无二的,因此我选择将其用作id,好吧我在想我自己,我将手动添加它。函数现在看起来像这样:
export default DS.RESTSerializer.extend({
extract:function(store,primaryType,payload,id,requestType){
var typeName = primaryType.typeKey;
for(var i=0;i<payload.length;i++){
payload[i].id = payload[i].inventoryId;
}
var data = {};
data[typeName] = payload; // creating root
payload = data;
return this._super(store,primaryType,payload,id,requestType)
}
});
通过手动复制一个属性,我觉得我在欺骗这个错误消息。此外,我有时会返回一个大的有效负载数组(超过 150k 行)。循环 O(n) 似乎并不适合为简单的映射付出代价。
是否有其他方法可以设置我的 WebAPI 或序列化程序,这样我在分配 ember 迫切需要的 id 时就避免了 for 循环。
【问题讨论】:
标签: json rest ember.js asp.net-web-api ember-data