Я использую AngularJS для разработки веб-сайта, и я делаю несколько выборок в API для отображения похожих продуктов, но у меня возникают проблемы, чтобы перечислять элементы, потому что в некоторых случаях случайным образом возвращается JSON: SyntaxError: Неожиданный токен в JSON в позиции 2512. У меня есть код:
$timeout(function() {
console.log(id_filtroParecido);
Conecta('get','getProdutosFiltrados', id_filtroParecido).then(function(val) {
vm.respostaListaParecidos = val;
});
}, 100);
В приведенном выше коде функция Conecta выполняет поиск в БД и возвращает JSON. Но его непредсказуемость, как в ней, работает иногда, но не срабатывает в другое время.
Здесь пример JSON я получает и работает отлично:
[{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 2</p>","informacao_produto":"<p>Informações técnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]
Вот пример JSON, который иногда возвращает ошибку, иногда нет:
[{"id_produto":"6","nome_produto":"HP G42-214BR","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descrição do note HP</p>","informacao_produto":"<p>Informações do note JP</p>","tags_produto":"tag1, tag2, tag3","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"6-hp-g42-214br","imagem_principal":"87c2ee41b5b8fc13db9a3c2db655667b.png","tamanho":[{"id_produto_tamanho":"54","nome_produto_tamanho":"1- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"352","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"9","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Ou em 10x de R$150.00","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 2</p>","informacao_produto":"<p>Informações técnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]
И вот пример JSON, который всегда возвращает ошибку:
[{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descrição da impressora Epson 2</p>","informacao_produto":"<p>Informações técnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]
Obs: Я использую одни и те же продукты здесь, но он не зависит от того, какой продукт возвращается
Здесь мой заводской код, который я использую для привязки к Angular с PHP:
.factory('Conecta', ['$timeout','$q','AppService', function(time, q, Service) {
return function(acao,api,parametro){
var deferred = q.defer();
switch(acao) {
case 'get':
Service.apiGET(api,parametro).then(function(response) {
if(response.status == 200){
deferred.resolve(response.data);
}else{
deferred.resolve(null);
}
}, function (error) {
console.error(error);
});
break;
default:
break;
}
return deferred.promise;
};
}])
Иногда проблема может заключаться в том, что вы возвращаете не ясный JSON, как он сказал в правилах синтаксиса и ожидаемый по причине браузера. Тип Content-типа ответа - application/json, но возвращает строку, которая содержит что-то очень похожее на объект JS.
Здесь очень грубо различие между JS object
JSON
и JS object
JSON: {"param":"value"}
JS object: {param:"value"}
Обратите внимание на кавычки для имени ключей. Но трудно сказать, какова реальная проблема в вашем коде без JSON, которые терпят неудачу.
Все ваши JSONs верны.
Вы можете выполнять
JSON.parse('{"kk":11}');
для каждого из них в некотором js REPL
(например, в консоли браузера) для проверки этого факта.
Возможные проблемы: