javascript — aysnch: false занимает много времени, чтобы загрузить асинхронный true возвращает неопределенный angularjs ng-show

Здравствуйте, у меня возникла проблема с этим кодом, он зависает в браузере пользователя, что не очень хорошо с точки зрения конечного пользователя …, но переключение асинхронного режима в значение true возвращает неопределенное значение, поскольку сервер не находится в состоянии готовности для возврата responseText .. wi ld Мне действительно нравится, что кто-то может дать мне представление о том, как восстановить этот код. потому что он выполняется в html ng-show @ the end конца

контроллер:

$scope.votecheck = function(item,emailid){
var email = emailid;
if( typeof item !== 'undefined')
{
var jsonData = $.ajax({
type: "GET",
url: 'ajax/voters.php?id='+item.ID+'&email='+email,
dataType: 'text',
async: false
}).responseText;

if(jsonData === "CanVote"){

return true;
}
else{

return false;
}   //return "canvote";
}
}

HTML:

<div class="row text-center">
<div class="col-md-10 col-md-offset-1" ng-show="!votecheck(item,me.email)">
<p class="contest-text voters"><a class="btn btn-info btn-block img-rounded" ng-disabled="true"><b>Thanks For Voting</b></a>&nbsp;&nbsp;</p>
</div>
<div class="col-md-10 col-md-offset-1" ng-show="votecheck(item,me.email)">
<p class="contest-text voters"><a class="btn btn-primary btn-block img-rounded" ng-click="upVote(item,me.email);"><b> VOTE</b></a>&nbsp;&nbsp;</p>
</div>

PHP:

<?php
include('../include/connect.php');
$id = $_GET['id'];
$emailid = $_GET['email'];
$query="select * from voters  where votedid='$id' and votersemail ='$emailid'";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
$rowcount = $result->num_rows;
if($rowcount === 0)
{
echo "CanVote";
}
else{
echo "cantvote";
}

?>

спасибо Гайз

0

Решение

Вы комбинируете jquery и угловой? Angular по своей природе асинхронный, и простой $ http.get с обещанием может решить эту проблему.

 your parameters should be passed here.
var url = 'ajax/voters.php?id='+item.ID+'&email='+email;
$http.get('url')
.success(function(data)
{

// do your operarion here;
})
.error(function(data){
//do what ever u want on error.
});

Надеюсь это поможет.

0

Другие решения

Прежде всего, вы должны использовать $http оказание услуг (https://docs.angularjs.org/api/ng/service/$ http) а не $.ajax,

Если я понял, что вы пытаетесь сделать, вы не должны показывать ссылку «голосовать», пока не убедитесь, что текущий пользователь может голосовать. Это можно сделать следующим образом:

// TODO : fill canVote object with your item list,
// I guess you're using ng-repeat, and have an array of items.
// This object will be used to determine if the user can vote or not.
// Key : item ; value : boolean
$scope.canVote = {
item1: false
};
$scope.votecheck = function(item,emailid){
var email = emailid;
if( typeof item !== 'undefined')
{
$http.get('ajax/voters.php?id='+item.ID+'&email='+email).then(
function cb_success(response) {
$scope.items[item] = response.data === "CanVote";
}, function cb_failure(response) {
console.error(response);
});
}
}
angular.forEach($scope.canVote, function (status, item) {
$scope.votecheck(item, $scope.me.email);
});

Вот как вы должны делать с вашим HTML:

<div class="row text-center">
<div class="col-md-10 col-md-offset-1" ng-show="canVote[item]">
<p class="contest-text voters"><a class="btn btn-info btn-block img-rounded" ng-disabled="true"><b>Thanks For Voting</b></a>&nbsp;&nbsp;</p>
</div>
<div class="col-md-10 col-md-offset-1" ng-show="canVote[item]">
<p class="contest-text voters"><a class="btn btn-primary btn-block img-rounded" ng-click="upVote(item,me.email);"><b> VOTE</b></a>&nbsp;&nbsp;</p>
</div>

Так как вы не предоставили JSFiddle (w / e), я не смог протестировать его. Дайте мне знать, если у вас есть какие-то проблемы.

0