我在AJAX的成功處理程式中回傳一個物件,在我的代碼進一步執行之前,我需要這個物件。然而,當使用AJAX時,它不會等待成功塊執行完畢,因此在成功處理程式回傳值之前,將myLayer變數的值列印為undefined,因為console.log(mylayer)行被執行。我怎樣才能等待成功處理程式回傳userLayer物件,使myLayer值不被undefined?
P.S. 不需要擔心myLayer和userLayer變數的資料型別和定義,因為它們在我的代碼中是正確的,并且被照顧到了。為了使問題簡單明了,我沒有把它放在這里。我已經在這個問題上卡了很久了。如果有任何幫助,我們將不勝感激:)
呼叫 AJAX 函式
myLayer = this.addUserLayerTreemail(userLayer)。
//這總是列印出 "undefined",因為它在AJAX之前被執行。
//成功處理器回傳值。
console.log(myLayer)
定義AJAX函式
addUserLayerTreemail(userLayer) {
let configData = {"searchText": "search", "searchType" : "treemail"};
$.ajax({
url: "./apis/mySearch"。
method: 'GET'。
dataType: 'json',
data : configData,
success: response => {
userLayer.query().where(response).run((data) => //span> {
userLayer.add(data)。
});
//我需要這個物件被存盤在myLayer變數中(當呼叫時
// 上面的函式)在AJAX函式的成功處理程式執行后。
//目前,它只在上面的console.log(myLayer)之后回傳這個變數
//在myLayer變數中產生了列印 "undefined"。
console.log(userLayer)。
return userLayer;
}
});
}
uj5u.com熱心網友回復:
你可以通過使用 "async "和 "await "使異步代碼看起來像同步代碼。 當你需要異步函式的回傳值時,使用關鍵字 "await"。
如果函式使用 "await",它必須在函式定義前有 "async "關鍵字
async addUserLayerTreemail(userLayer) {
let configData = {"searchText": "search", "searchType" : "treemail"};
var response = await $.ajax({
url: "./apis/mySearch"。
method: 'GET'。
dataType: 'json',
data : configData,
});
userLayer.query().where(回應).run((data)=>; {
userLayer.add(data)。
});
console.log(userLayer)。
return userLayer;
}
不要忘記在父腳本中添加 "async"
async function main(userLayer){
myLayer = await this.addUserLayerTreemail(userLayer)。
console.log(myLayer)
}
uj5u.com熱心網友回復:
你可以用Promise來包裝ajax呼叫,例如
async function addUserLayerTreemail(userLayer) {
let configData = { searchText: "search", searchType: "treemail" }。
return new Promise((resolve, reject) => /span> {
$.ajax({
url: "./apis/mySearch"。
method: "GET"。
dataType: "json",
data: configData,
success: (response) => {
用戶層
.query()
.where(回應)。
.run((data) => {
userLayer.add(data)。
});
resolve(userLayer)。
},
error。(error) => {
reject(錯誤)。
},
});
});
然后你可以通過使用下面的代碼來消耗資料:
async function print(){
try {
myLayer = await this.addUserLayerTreemail(userLayer)。
console.log(myLayer)
} catch(錯誤) {
console.log(error)
}
}
print()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/321657.html
標籤:
