小弟最近開始學JavaScript遇到了這個問題
function data_load()
{
var src_url = /*url*/;
var xhr = new XMLHttpRequest();
xhr.open('get', src_url, true);
xhr.send();
xhr.onload = function () {
if (xhr.status == 200) {
return JSON.parse(xhr.responseText);
}
};
}
const data=data_load();
我想要把ajax裡的回傳的資料return出來
但由於ajax是非同步的
所以data不會是 data_load return出來的東西
想請問要如何解決呢?(除了讓ajax變成是同步以外)
ajax回傳的資料比較少拿來return,
反而是資料回傳之後直接操作DOM,
或是呼叫其他的function來操作DOM,
我通常都是這樣做.
首先要釐清,Ajax 都是非同步操作、都是放進 micro queue 中,等待 call stack 中的程式執行完成。(不存在讓 Ajax 變成同步這回事)因此任何你想要的 Ajax 後的操作,都要在同樣是非同步的函數中執行。
以你這個例子來說,就是在 onload 註冊的 function 中執行,如果你想讓 code 漂亮一點,可以自行回傳一個 Promise,分別在 .then 或是 .catch handle 成功以及失敗的結果。
如果把
xhr.open('get', src_url, true);
改成
xhr.open('get', src_url, false);
不就是同步執行了嗎?
還是我觀念上的理解有錯呢?
現在可以不代表未來可以。
未來同步的 XMLHttpRequest會改成只能在worker裡面使用,參考: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests#Synchronous_request 前面的note。
好的 謝謝大大
一般來說,我的做法是會用個函式來處理接收後要處理的事件。
畢竟就如大家說的,ajax是屬於非同步式的回應。
用return來說其實是沒意義的。(雖然還是可以用等待的方式來處理)
個人的做法是除了上面說的,收到回應後做處理各項動作。
比較單純點就是用function另外處理。也是有點是backcall的觀念。
請問大概是像這樣嗎?
function fun1()
{
//do something...
}
function data_load(fun)
{
var src_url = /*url*/;
var xhr = new XMLHttpRequest();
xhr.open('get', src_url, true);
xhr.send();
xhr.onload = function () {
if (xhr.status == 200) {
fun();
}
};
}
data_load(fun1);
類似這樣沒錯。不過正常我會
fun(xhr.responseText);
將值傳過去
了解
謝謝大大