我試圖在ajax請求的回應中更新一個變數,以查看用戶傳遞的令牌是否為真。
以下是完整的場景代碼:
class InitScene extends Phaser.Scene{
constructor(){
super("InitScene"/span>)
}
preload(){
this.Token = getParameterByName('Token')|1;
let validateData ={
Token:this.Token。
}
this.correctToken=false;
$.ajax({
url: "validateTokenAPI"/span>,
type: "POST"。
data: JSON.stringify(validateData)。
headers: {
"Content-Type": "application/json"。
},
success: function (response) {
//回應是一個bool。
this.correctToken = response;
console.log(this.correctToken) 。
},
error: function(jqXHR, textStatus, errorThrown) {
console.log('error')。
}
});
}
create(){
let { width, height } = this.sys.game.canvas。
this.add。 text(width/2, height/2,"LOADING..."/span>, {font: "28px Arial", fill: "black"}).setOrigin(0.5)。
console.log(this.correctToken)。
if(this.correctToken){
this.scene.start("NextScene") 。
}
}
update(){
console.log(this.correctToken) 。
if(this.correctToken){
this.scene.start("NextScene") 。
}
}
}
function getParameterByName(name, url = window.location.href) {
name = name.replace(/[[]]/g, '$& ');
var regex = new RegExp('[? &] ' name '(=([^&#]*)|&|#|$)')。
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return ' ';
return decodeURIComponent(results[2]。 replace(/ /g, ' '))。)
}
我試圖在預加載函式中獲得ajax的結果,然后在創建或更新中使用它。
函式getParameterByName僅僅是plagiarized從url中獲取Token;
預加載函式最初將this.correctToken的值設定為false,然后在ajax回應為true時將其設定為true;
創建和更新函式將this.correctToken的值設定為false。
如果Token是正確的,創建和更新函式將玩家移動到下一個場景(我同時嘗試了這兩個函式,因為我想也許是由于ajax的異步性?
this.correctToken的值在創建和更新時總是列印為false,但在ajax回應時卻是true
這是不可行的,因為我猜測ajax是異步的,并且在回傳回應id之前,值是在預加載中設定的。
我同樣嘗試將ajax放在創建中,然后在更新中使用它。
此外,在一個函式中添加ajax,然后回傳回應也沒有成功。
makeValidateAjax(Token){
let validateData ={
Token:Token。
}
$.ajax({
url: "validateTokenAPI"。
type: "POST"。
data: JSON.stringify(validateData)。
headers: {
"Content-Type": "application/json"。
},
success: function (response) {
return 回應。
},
error: function(jqXHR, textStatus, errorThrown) {
return false。
}
});
}
編輯
同時在ajax回應中呼叫this.scene.start("NextScene");也不起作用,因為ajax中沒有定義場景。
編輯2
#correctToken;
constructor(){
super("InitScene"/span>)
this.#correctToken=false;
}
當我在ajax回應中改變變數時,在構造器中定義變數也會回傳一個錯誤
未發現TypeError。不能將私有成員 #correctToken 寫入一個其類沒有宣告的物件中
uj5u.com熱心網友回復:
考慮使用EventEmitter。它可以是沿著這些路線的單子模式:
// eventDispatcher.js
export default class EventDispatcher extends Phaser. Events.EventEmitter {
constructor() {
super()。
}
static getInstance() {
if (instance === null) {
instance = new EventDispatcher();
}
return instance。
}
}
// InitScene的預加載。
this.emitter = EventDispatcher.getInstance() 。
//使用胖箭頭函式來保留ajax的回呼中的.this。
[...]
success: (response) =>/span> {
//回應是一個bool。
this.correctToken = response;
console.log(this.correctToken)。
this.emitter。 emit('CORRECT_TOKEN', this.correctToken) 。
},
[...]
//創建。
this.emitter。 on('CORRECT_TOKEN', (token) => /span> {
this.scene.start("NextScene")。
});
作為一個替代方案,如果你可以麻煩地安裝Rex的一個插件(它們都非常棒),我會選擇Await loader。
我模擬了一些主要的代碼,未經測驗(你需要像檔案頁面上說的那樣進行設定)。github上的完整獨立示例
const callback = function(successCallback, failureCallback){
$.ajax({
url: "validateTokenAPI"/span>,
type: "POST"。
data: JSON.stringify(validateData)。
headers: {
"Content-Type": "application/json"。
},
success: (response) => {
//回應是一個bool。
this.correctToken = response;
console.log(this.correctToken)。
successCallback()。
},
error。(jqXHR, textStatus, errorThrown) => {
console.log('error')。
failureCallback()。
}
});
}
this.load.rexAwait(回呼)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323837.html
標籤:
