2016-07-26 113 views
0

我創造了這個同步的Ajax功能,以簡單的發佈數據:的Javascript/jQuery的AJAX後返回undefined

function postme(id, tt) { 
tt['id'] = id; 

$.ajax({ 
    async:false, type: 'post', url: 'post.php', data: tt, 
    success: function(response){ console.log(response);return response; } 
}); 
} 

的迴應是:{"Info": "aoaaa"}

console.log(response);在控制檯提供了JSON,但返回給出'未定義'。我試着給它這樣的:

postme('generate', {'1':'ee','w':'yy'}); 

我試圖JSON解析,給人的功能我什麼都試過,我可以在網上找到,但它只是不工作的名稱。

我看了How do I return the response from an asynchronous call?但似乎並沒有爲我工作,因爲該功能不發送變量像我這樣的,它只會做foo();postme();在我的情況。我如何用vars做到這一點?

編輯:我不需要使用異步,如果有更好的代碼不使用它,我寧願使用它。

+0

@ jfriend00這是不是重複,請閱讀我的問題。 – wtm

+1

哦,哎呀。你在做同步Ajax。那太糟了。我將取消標記,但這是你的第一個問題。停止使用同步Ajax。這對用戶體驗來說很糟糕。 – jfriend00

+0

你真的可以閱讀每縮進只縮進一個空格的代碼嗎?我當然不能。 – jfriend00

回答

2

首先,停止使用同步Ajax。這對於用戶體驗來說很糟糕,幾乎不會被使用。

但是,如果您使用的是同步Ajax,則問題是postme()中沒有返回值。您正在返回success處理程序,但這只是返回到ajax基礎結構中,而不是返回給postme()的調用方。相反,你可以簡單地這樣做:

function postme(id, tt) { 
    tt['id'] = id; 
    var retVal; 

    $.ajax({ 
     async: false, 
     type: 'post', 
     url: 'post.php', 
     data: tt, 
     success: function (response) { 
      console.log(response); 
      retVal = response; 
     } 
    }); 
    return retVal; 
} 

你真正應該做的是使用AJAX的異步這樣的:

function postme(id, tt) { 
    tt['id'] = id; 

    return $.ajax({ 
     async: true, 
     type: 'post', 
     url: 'post.php', 
     data: tt 
    }); 
} 

postme(...).then(function(response) { 
    // process response here 
}, function (err) { 
    // handle error here 
}); 
+0

編輯:我不需要使用異步,如果有更好的代碼不使用它,我寧願使用它。 – wtm

+0

我會嘗試第二個代碼。謝謝。 – wtm

+0

第二個是我的解決方案,謝謝! – wtm

1

我同意同步AJAX應該是可以避免的,但如果必須這應該工作:

function postme(id, tt) { 
var r = null; 
tt['id'] = id; 

$.ajax({ 
    async:false, type: 'post', url: 'post.php', data: tt, 
    success: function(response){ console.log(response);r =response; } 
}); 

return r; 
} 
+0

編輯:我不需要使用異步,如果有更好的代碼不使用它,我寧願使用它。 – wtm

+0

如果你不需要同步AJAX,那麼它是一個愚蠢的:http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call。上面的jfriend00答案有一個很好的例子,說明如何使用異步來做到這一點。 – dave

+0

請注意,瀏覽器不推薦使用'async:false',並且現在在使用控制檯時警告控制檯存在deprection – charlietfl

0

假設返回值是在一些功能應用,如:

function foo(response) { /* some code */} 

然後提供foo作爲回調。

function postme(id, tt, callback) { 
tt['id'] = id; 

$.ajax({ 
    type: 'post', url: 'post.php', data: tt, 
    success: callback 
}); 
} 

,並調用該函數 'postme' 爲:

postme(param1, param2, foo)