JSON.parse(...)。reelarray为null - ActionScript

时间:2015-10-06 10:43:20

标签: actionscript-3

作为回报,我得到null

public function spin()
{
    var decoded : Object;
    trace("i am innnnnnn");
    var sendLoaders:URLLoader;
    var sendRequests:URLRequest;
    sendLoaders = new URLLoader();
    sendRequests = new URLRequest("http://localhost/getspinvalue/4");
    var difvar:Array = [];

    sendLoaders.addEventListener(Event.COMPLETE, botCompleted);
    sendLoaders.load(sendRequests);
    function botCompleted(e:*)
    {
        decoded = JSON.parse(e.currentTarget.data);
    }
    trace(decoded);
    return decoded.reelarray;
}

3 个答案:

答案 0 :(得分:0)

好吧,sendLoaders.load()是一个异步事件,你的函数返回null,因为当函数返回时botCompleted()函数没有被触发

你需要在你的botComplete函数中继续执行(如果你需要在每次spin()之后做不同的事情,你可以传递一个被执行的函数)

public  function spin() {       
    var decoded : Object;
    trace("i am innnnnnn");
    var sendLoaders:URLLoader;
    var sendRequests:URLRequest;
    sendLoaders = new URLLoader();     


    sendRequests = new URLRequest("http://localhost/getspinvalue/4");
    var difvar:Array = [];

    sendLoaders.addEventListener(Event.COMPLETE, botCompleted);             
    sendLoaders.load(sendRequests);             
    trace("request sent")
}

function botCompleted(e:*) {                                           
    decoded = JSON.parse(e.currentTarget.data);
    trace("data recieved:" + decoded)
    //CONTINUE EXECUTION HERE
}

答案 1 :(得分:0)

URLLoader.load是一种异步方法,它意味着它会生成一个加载URL的进程,并继续执行spin。所以它立刻返回一个值。稍后在满足请求时执行botCompleted功能。这样的事情:

sendLoaders.load()
return value
botCompleted()

所以你应该依赖于botCompleted函数,而不是依赖于返回值。应该在botCompleted函数内触发所有依赖于解码结果的逻辑。

function botCompleted(e:Event):void {
  decoded = JSON.parse(e.currentTarget.data);
  handleDecodedResult(decoded);
}

答案 2 :(得分:0)

  

我希望我的spin方法返回解码后的值。所以我该如何改变   我的代码。

这是不可能的。 JSON数据是异步加载的,但函数同步返回。换句话说,spin()函数会立即返回(就像所有函数一样),但URLLoader不会在稍后时间内完成。在botCompleted语句之前编写return处理程序并不重要,直到稍后它才会被调用。这就是事件处理程序的用途:处理异步事件。

你可以做的是传递回调函数。例如:

function spin(callback:Function):void {
    var loader:URLLoader = new URLLoader();
    // .. load
    loader.addEventListener(Event.COMPLETE, complete);
    function complete(e:Event):void {
        var decoded:Object = JSON.parse(e.target.data);
        callback(decoded);
    }
}

现在,您可以调用spin函数并在您调用spin的上下文中传递匿名函数,几乎使其看起来是同步的:

spin(function(data:Object):void {
    trace(data);
    // Do stuff with data here
});
// Note: data is not available yet from here, only from inside the callback above

这是一种常见做法(在AS3和JS中),support