Использование пользовательского класса для обработки запросов к базе данных в AS3

Недавно я начал изучать пользовательские классы в AS3 (чтобы отточить свои лучшие практики кодирования) и хотел создать класс базы данных, который позволит пользователю сначала создать экземпляр класса, который содержит всю информацию, необходимую для добавления методов в классе, удалять, изменять (и т. д.) строки в таблице MySQL (через PHP). Конечно, это включает использование URLRequest, URLLoader и так далее. Мой вопрос заключается в том, придумал ли кто-нибудь способ, как вернуть данные из метода, специально содержащего эти данные var, не полагаясь на метод, по сути, отправляющий событие (затем создающий прослушиватель, а не встроенный в класс). Например,

var myDB:dataBase = new dataBase("dbase","table","username","pword");

//this creates an instance of a database class with methods like:

trace(myDB.fetch(1)); //gets first row of table as a delimited string

ИЛИ ЖЕ

if (myDB.delete(1)) {}
//returns Boolean true if delete of row 1 was successful

Я нашел ответ ниже, который содержал способ создать класс, который возвращает событие:

Объединение URLRequest, URLLoader и Complete Listener событий в Actionscript 3.0?

но я хочу, чтобы метод возвращал строку, содержащую данные из базы данных или логическое подтверждение, а не отправлял прослушиватель событий. Вот пример класса, который я сделал:

package com.customClasses {
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequestMethod;
import fl.events.DataChangeEvent;
import flash.events.Event

public class dataBase {
public var dbs:String = "";
public var usr:String = "";
public var pwd:String = "";
public var tab:String = "";
var returnData:String = "";

// Constructor
public function dataBase(dbs:String, usr:String, pwd:String, tab:String) {
this.dbs = dbs;
this.usr = usr;
this.pwd = pwd;
this.tab = tab;
}

public function fetch(idn:uint, par:String):String {
var returnData:String = "blank";
var vUrlReq:URLRequest = new URLRequest ("dBase.php");
var vUrlVars:URLVariables = new URLVariables();

function onLoadVarsComplete(event:Event): void {
//retrieve success variable from our PHP script:
if(event.target.data.msg == "success") {
var rawData:URLVariables = new URLVariables( event.target.data );
returnData = rawData.fromPHP;
} else {
returnData = "failed!";
}
}
vUrlReq.method = URLRequestMethod.POST;
vUrlVars.dir=dbs; // name of table affected
vUrlVars.alpha=usr; // username
vUrlVars.beta=pwd;  // password
vUrlVars.dbase=tab; // name of table affected
vUrlVars.func="fetch"; // function for php script to use
vUrlVars.idnum=idn; //if >0 search for record with that id
vUrlReq.data = vUrlVars;
var vLoader:URLLoader = new URLLoader (vUrlReq);
vLoader.addEventListener("complete", onLoadVarsComplete);
vLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
vLoader.load(vUrlReq);

return (returnData);
}

returnData возвращает «пусто» … поэтому я понимаю, что мой метод не работает, как предполагалось. Я также понимаю, что могут возникнуть некоторые проблемы с областью возвращаемой строки, и что я использую вложенную функцию (вероятно, нет-нет). Иначе какие-нибудь мысли?

2

Решение

Чтобы сделать то, что вы хотите, вы можете использовать функцию обратного вызова или DataEvent слушатель, вот так:

DB.as:

package  {

import flash.net.*;
import flash.events.*;

public class DB extends EventDispatcher {

public static const DATA_LOADED = 'data_loaded';

public function DB() {
}

public function getDataUsingDataEvent(file_path:String):void {

var url_loader:URLLoader = new URLLoader();
url_loader.addEventListener(
Event.COMPLETE,
function(e:Event):void
{
var event:DataEvent = new DataEvent(DATA_LOADED, true, false, url_loader.data);
dispatchEvent(event);
}
)
url_loader.load(new URLRequest(file_path));
}

public function getDataUsingCallback(file_path:String, callback:Function):void {

var url_loader:URLLoader = new URLLoader();
url_loader.addEventListener(
Event.COMPLETE,
function(e:Event):void
{
callback(url_loader.data);
}
)
url_loader.load(new URLRequest(file_path));
}

}

}

А потом :

var db:DB = new DB();

db.addEventListener(
DB.DATA_LOADED,
function(event:DataEvent):void {
trace(event.data);
}
)
db.getDataUsingDataEvent('file_path');

db.getDataUsingCallback(
'file_path',
function(data:String):void {
trace(data);
}
)

Надеюсь, что это может помочь.

0

Другие решения

Как вы заявили, это не может быть сделано в AS3. Вы не можете ждать асинхронной операции (например, URLLoader/load()) перед возвратом функции и продолжением выполнения скрипта.

Что вы можете сделать, если вы предпочитаете не использовать addEventListener() так много, пройти через обратные вызовы или реализовать метод цепочки из обещания. Эти шаблоны не обязательно лучше, чем использование событий, и имеют свои собственные проблемы, но позволяют вам писать код, который, возможно, более читабелен как последовательность. Эти шаблоны распространены в Javascript (который имеет то же асинхронное поведение, что и ActionScript), например, jQuery. Остерегаться «обратный вызов ада» и «крушения поезда». Эти методы направлены на то, чтобы сделать вещи проще для написания, но иногда делают вещи более подверженными ошибкам.

0

По вопросам рекламы [email protected]