Php 成功处理Ext.Ajax.request中的行为

Php 成功处理Ext.Ajax.request中的行为,php,extjs4,ajax-request,Php,Extjs4,Ajax Request,我正在从事ExtJS4项目。在这个项目中,我必须在js和php文件之间来回通信。为了从js调用php,我使用Ext.Ajax.request var dirs = []; Ext.Ajax.request( { url: 'text.php', method: 'GET', success: function(response) { dirs = JSON.parse(response.responseText); }, fa

我正在从事ExtJS4项目。在这个项目中,我必须在
js
php
文件之间来回通信。为了从js调用php,我使用Ext.Ajax.request

var dirs = [];

Ext.Ajax.request(
{
    url: 'text.php',
    method: 'GET',
    success: function(response) 
    {
        dirs = JSON.parse(response.responseText);

    },
    failure: function(response) 
    {
        alert('server-side failure with status code ' + response.status);
    }
});

// Creating dropdown list menu
document.write("<select class='select'>");
for (var i = 0; i < dirs.length; i++)
{
    document.write("<option>" + dirs[i] + "</option>");
}
document.write("</select>");
var-dirs=[];
Ext.Ajax.request(
{
url:'text.php',
方法:“GET”,
成功:功能(响应)
{
dirs=JSON.parse(response.responseText);
},
故障:功能(响应)
{
警报(“服务器端故障,状态代码为”+响应状态);
}
});
//创建下拉列表菜单
文件。填写(“”);
对于(变量i=0;i
php代码如下所示:

<?php

$filepath = "scenarios";
$dirs = array();
$files = array();

$scenes = array_diff(scandir($filepath), array('..', '.'));

for ($i = 2; $i < count($scenes)+2; $i++)
{
    if (strpos($scenes[$i], '.'))
    {
        array_push($files, $scenes[$i]);
    }
    else
    {
        array_push($dirs, $scenes[$i]);
    }
}

if (count($dirs) > 0)
{
    echo json_encode($dirs);
}
else
{
    echo json_encode("You do nat have any projects. Please create new project.");
}   

?>

现在,问题出现在我希望从生成的
dirs对象生成列表菜单的部分。在firebug DOM dirs=[“google”,“yahoo”]中,但在循环中,dirs.length返回0


另外,当我在for循环之前放置
alert(dirs.length)
时,它显示0,然后正确地生成列表菜单…奇怪???

请求调用是异步的,这意味着调用Ext.Ajax.request后,下一条指令就是您的循环。但您尚未从服务器收到数据。您需要将循环放入成功回调中,以确保在从服务器获取数据后执行它

var dirs = [];

Ext.Ajax.request(
{
    url: 'text.php',
    method: 'GET',
    success: function(response) 
    {
        dirs = JSON.parse(response.responseText);
        // Creating dropdown list menu
        document.write("<select class='select'>");
        for (var i = 0; i < dirs.length; i++)
        {
          document.write("<option>" + dirs[i] + "</option>");
        }
        document.write("</select>");

    },
    failure: function(response) 
    {
        alert('server-side failure with status code ' + response.status);
    }
});
var-dirs=[];
Ext.Ajax.request(
{
url:'text.php',
方法:“GET”,
成功:功能(响应)
{
dirs=JSON.parse(response.responseText);
//创建下拉列表菜单
文件。填写(“”);
对于(变量i=0;i
另外,当我在for循环之前放置alert(dirs.length)时,它显示为0, 然后正确生成列表菜单…奇怪


这是因为
警报将停止程序的执行流,直到您单击“确定”。在此期间,数据可能来自服务器,并且
dir
变量中填充了这些数据。

请求调用是异步的,这意味着调用Ext.Ajax.request后,下一条指令就是循环。但您尚未从服务器收到数据。您需要将循环放入成功回调中,以确保在从服务器获取数据后执行它

var dirs = [];

Ext.Ajax.request(
{
    url: 'text.php',
    method: 'GET',
    success: function(response) 
    {
        dirs = JSON.parse(response.responseText);
        // Creating dropdown list menu
        document.write("<select class='select'>");
        for (var i = 0; i < dirs.length; i++)
        {
          document.write("<option>" + dirs[i] + "</option>");
        }
        document.write("</select>");

    },
    failure: function(response) 
    {
        alert('server-side failure with status code ' + response.status);
    }
});
var-dirs=[];
Ext.Ajax.request(
{
url:'text.php',
方法:“GET”,
成功:功能(响应)
{
dirs=JSON.parse(response.responseText);
//创建下拉列表菜单
文件。填写(“”);
对于(变量i=0;i
另外,当我在for循环之前放置alert(dirs.length)时,它显示为0, 然后正确生成列表菜单…奇怪


这是因为
警报将停止程序的执行流,直到您单击“确定”。在此期间,数据可能来自服务器,并且
dir
变量中填充了这些数据。

我看不到发送的任何标题-这是大多数浏览器所必需的:

header('content-type: application/json; charset=utf8;');
if(sizeof($dirs) > 0){
   echo json_encode(array('success' => true, 'data' => $dirs));
}
else {
   echo json_encode(array('success' => false, 'error' => 'You do not have any projects.' ));
} 
JavaScript:

var xhr = new Ext.data.Connection();
xhr.request({
   url: '/text.php',
   method: 'GET',
   headers: {'Accept':'application/json'},
   success: function(response, opts) {
      var obj=Ext.decode(response.responseText);
      var html='';
      Ext.each(obj.data, function(v,i){html+='<option>'+v+'</option>';});
      html='<select>'+html+'</select>';
      console.info(html);
   }
});
var xhr=new Ext.data.Connection();
请求({
url:“/text.php”,
方法:“GET”,
标题:{'Accept':'application/json'},
成功:功能(响应、选项){
var obj=Ext.decode(response.responseText);
var html='';
Ext.each(obj.data,函数(v,i){html+=''+v+'';});
html=''+html+'';
控制台信息(html);
}
});
HTML生成必须驻留在回调函数中,否则就毫无意义

如果没有看到返回的JSON,就很难判断它出了什么问题


没有留下评论的向下投票为什么确切地说真的很蹩脚。

我看不到任何标题被发送出去-这是大多数浏览器所要求的:

header('content-type: application/json; charset=utf8;');
if(sizeof($dirs) > 0){
   echo json_encode(array('success' => true, 'data' => $dirs));
}
else {
   echo json_encode(array('success' => false, 'error' => 'You do not have any projects.' ));
} 
JavaScript:

var xhr = new Ext.data.Connection();
xhr.request({
   url: '/text.php',
   method: 'GET',
   headers: {'Accept':'application/json'},
   success: function(response, opts) {
      var obj=Ext.decode(response.responseText);
      var html='';
      Ext.each(obj.data, function(v,i){html+='<option>'+v+'</option>';});
      html='<select>'+html+'</select>';
      console.info(html);
   }
});
var xhr=new Ext.data.Connection();
请求({
url:“/text.php”,
方法:“GET”,
标题:{'Accept':'application/json'},
成功:功能(响应、选项){
var obj=Ext.decode(response.responseText);
var html='';
Ext.each(obj.data,函数(v,i){html+=''+v+'';});
html=''+html+'';
控制台信息(html);
}
});
HTML生成必须驻留在回调函数中,否则就毫无意义

如果没有看到返回的JSON,就很难判断它出了什么问题


没有留下评论的向下投票为什么确切地说真的很蹩脚。

你的问题是什么?对不起,我还在编辑问题。如果我把for循环放在success里面,浏览器会无限循环。你能放两个dirs.length警报吗,一个在内部成功,一个在循环之前,告诉我哪个先执行,每个的值?首先调用成功,显示2,然后循环之前的一个显示0。这就是让我困惑的地方:即使循环前dirs.length=0,循环也会执行,列表菜单会正确生成2个元素。你的问题是什么?对不起,我还在编辑问题。如果我将for循环放入success中,浏览器会无限循环。你能放两个dirs.length警报吗,一个在内部成功,一个在循环之前,告诉我哪个先执行,每个的值?首先调用成功,显示2,然后循环之前的一个显示0。这就是让我困惑的地方:即使在循环之前dirs.length=0,循环也会被执行,列表菜单也会正确生成