2017-04-12 2 views
0

私は "thumbsup"と "like"をPHPスクリプトのAJAX/POST経由で投稿するプロジェクトに取り組んでいます。これは、ユーザーがログインしているかどうか(json_encodeを持つ)エラー配列ではなく、処理後に戻ります。 0はそのすべてがOK、1がユーザーがログインしなかったことを意味します。私が書いたsubmit関数は、各ループでそれを再定義した後にエラー変数を返しません。各ループでconsole.log(エラー)を実行すると1が返されますが、click関数でチェックするとfalseが返されます。私は次の2つの機能を持っています:このjsコードで何が問題なのですか?関数から変数を返す

私は何が間違っているのか分かりません。

function submit(tip,varid){ 
    var error = false; 
    $.post("/rwfr.php", { name: ""+tip+"", id: ""+varid+"" }) 
    .done(function(data) { 
     var results = jQuery.parseJSON(data); 
     $(results).each(function(key, value) { 
      error = value['error']; 
      return false; 
     }) 
    }); 
    return error; 
} 

$(".fa-thumbs-up").click(function(){ 
    var idObj = $(this).parent().parent().attr("data-id"); 
    var act = submit('thumbsup',idObj); 
    if(act == "1"){ 
     console.log(act); 
     alert("You must log in before you can rate this video!"); 
    } 
}); 
+1

を参照してください;' each'ループ 'に。 – Oen44

+0

も参照してください[関数内で変数を変更した後に変数が変更されないのはなぜですか? - 非同期コードリファレンス](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) –

+0

あなたは知っているsubmit関数は、.done関数が正しく呼び出される前に長く戻りますか? – James

答えて

-2

それが否決されているが、同様の問題を持つ人は、これは簡単で、便利かもしれませんとして、私はこの答えを守ってきました。それはあなたのケースでfalseを返します

の理由は、あなたがvallue falseerrorを初期化してきたので、あなたはsubmit()からの応答を得るまでに、if(act=="1")すなわちあなたの次の行はもちろん、falseを返します実行し、されている、ということです。

あなたの機能で変更できるのは、ポストリクエストの.done()の中で呼び出さなければならないコールバック関数内で受け取った応答のエラーをチェックするスニペットを移動することだけです。

はfalseを返す `削除し、以下の

// your submit function 
function submit(tip, varid, callback){ 
    var response = $.post("post.php", { name: ""+tip+"", id: ""+varid+""}); 
    response.done(function(data){ 
     callback(JSON.parse(data), tip); 
    }); 
} 

// your callback function 
function callbackFunction(response, action_type){ 
    // handle your prompts here based on your action_type i.e. thumbs up, down, favourite, etc. 
    console.log(response); 
    if(response.hasOwnProperty("error") && response["error"]=="1"){ 
     console.log("you need to login to do this!"); 
    } 
} 

// and pass the callback function to your submit function 
var act = submit('thumbsup',idObj, callbackFunction); 
+0

私が知っていることから、falseは各ループを壊します。私は偽りなく、同じ結果を返すことなくそれを試しました。 –

+0

jQueryの '.each'の中で' return false'が繰り返しを停止します。これはネイティブ '.forEach'やlodashやアンダースコアでは当てはまりません。これは、私の意見では、彼らの意義あるデザイン決定です。 –

+0

ありがとう、これは各ループなしで動作します。それでも私のコードで何が間違っていますか?私は最初にwanntedのように動作させる方法はありますか?私はすべてのクリックアクションが独自のメッセージを持つように、私はより多くのアクション(親指、親指、後で見る、お気に入りに追加、レポート)にこの機能を使用するので、私は送信機能内でエラー出力を使用することはできません。 –

関連する問題