0

私はこれをやろうとして悪夢を見ています。私が読んださまざまな投稿からこれまでに約15の異なる方法を試したに違いありませんが、すべて失敗しました。

ajax投稿から戻り値を取得しようとしています。これが私のコードです

var test = compareNew(this.name, "remove");
alert(test);

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
      var myObject = eval("(" + result + ")");
      alert(myObject.html);
      return(result);
    }
  });
}

alert(myObject.html); 返されたhtmlが正しく表示されますが、alert(test); 「未定義」を表示します。私はこれに何時間も費やしましたが、それを理解することはできません。私が欠けているものがわかりますか?

4

10 に答える 10

2

実際には通話returnでは機能しませんが、設定すると機能します。この(同期通話)の場合は、これを試すことができます。asynchronousasync:false

function compareNew(obj, action) {
    $.ajax({
        url: "AJAX_compare_server.php",
        type: 'post',
        data: {
            compare_id:  obj,
            action:   action
        },
        success: function(result) { 
            returnresult(result); // will call the function and will alert
        }
    });
}

function returnresult(ret){
    // Do whatever you want to do with the result
    if(ret) alert(ret);
}
compareNew(this.name, "remove");

また、あなたはそれを次のように使うことができます

function compareNew(obj, action, callBack) {
    $.ajax({
        //...
        success: function(result) { 
            callBack(result);
        }
    });
}

そしてそれを次のように呼びます

compareNew(this.name, "remove", function(data){
    alert(data);
});
于 2012-10-16T19:32:12.850 に答える
1

関数のみが値を返します。ajaxのreturnout側を使用する必要があります.....

于 2012-10-16T19:28:12.017 に答える
0

ajax呼び出しは非同期です。開始されると、javascriptは実行を継続し、関数は終了します。サクセスハンドラーのreturnステートメントは、その匿名関数へのreturnであり、compareNew関数へのreturnステートメントではありません。undefinedこれは、スクリプトに期待する結果です。

おそらくあなたがすべきことは、success関数にあなたが定義した別の関数を呼び出させることであり、その関数はあなたのajax呼び出しから返された値に対して作業を実行するはずです。

メソッドを同期させたい場合は、設定できるオプションがあります(おそらく、すでに試したオプションの1つです)。サクセスハンドラーで、関数のスコープとなる変数を返したい値に設定し、ajaxメソッド呼び出しの後にその値を返します。ただし、ajax呼び出しを同期的に行うと、呼び出しが返されるのを待っている間に他のJavaScriptが実行されなくなり、通常はユーザーエクスペリエンスが低下するため、これはお勧めしません。

于 2012-10-16T19:17:24.577 に答える
0

ここで注意すべき2つのこと。

  1. ajax呼び出しは非同期です。つまり、alert(test)実行後に戻る可能性があります。
  2. return (result)から戻っていませんcompareNew。作成した関数から戻ってきsuccessます
于 2012-10-16T19:17:47.770 に答える
0

Ajaxからの戻り値を持つことはできません。

非同期です

于 2012-10-16T19:17:57.080 に答える
0

returnメソッドとして使用しています

正しいのは:

return result;
于 2012-10-16T19:18:01.883 に答える
0

Ajaxは非同期であるためalert(test);、ajax呼び出しの結果が終了する前にが実行されます。それがあなたが未定義になる理由です。

于 2012-10-16T19:20:22.877 に答える
0

asyncをfalseに設定してから、successステートメントで戻り値を設定します。メソッドの最後(ajaxリクエスト以外)で、retValを返します。

function compareNew(obj, action) {
  var retVal;
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
    async: false,
    success: function (result) {
      var myObject = eval("(" + result + ")");
      retVal = myOBject.html;
      alert(myObject.html);
    }
  });
  return retVal;
}
于 2012-10-16T19:22:56.853 に答える
0

テスト用のFirefoxがある場合は、アラートをconsole.log()に変換することで、非同期呼び出しがどのように機能するかを確認できます。コンソールを開きます。これにより、ダンプしているテキストが表示されるだけでなく、ajax投稿の視覚的表現(送信および送信されるデータとともに)が提供されます。テスト変数がすぐにどのように実行されるかを確認できます。ところで、テストを少なくとも定義したい場合は、compareNewが「何か」を返すようにしてみてください。下部には、ajaxが存在しなかったかのように。

var test = compareNew(this.name, "remove");
console.log(test);

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
      var myObject = eval("(" + result + ")");
      console.log(myObject.html);
      //return(result); //this line isn't gonna do anything.
    }
   return "something";
  });
}

`

于 2012-10-16T19:29:56.587 に答える
0

AJAXリクエストのように、非同期呼び出しから戻り値を取得することはできません。その理由は、応答を待機しているコードが、応答を受信するまでにすでに実行されているためです。success:解決策は、コールバック内で必要なコードを実行することです。

function compareNew(obj, action) {
  $.ajax({
    url: "AJAX_compare_server.php",
    type: 'post',
    data: {
      compare_id:  obj,
      action:   action
    },
      success: function (result) {
        // Run the code here that needs
        //    to access the data returned
        return result;
    }
  });
}

success:または、コールバック内で別の関数を呼び出すことができます

function compareNew(obj, action) {
      $.ajax({
        url: "AJAX_compare_server.php",
        type: 'post',
        data: {
          compare_id:  obj,
          action:   action
        },
          success: function (result) {
            callFuction(result)
            return result;
        }
      });
    }

同期させることもできます。あなたはasync:falseそれを実現する必要があります。

function compareNew(obj, action) {
var return_this;
$.ajax({
url: "AJAX_compare_server.php",
type: 'post',
async: false,
data: {
  compare_id:  obj,
  action:   action
},
success: function (result) {
            return_this = result;
    }
  });
return return_this;
}
于 2012-10-16T19:31:57.673 に答える