Javascript массив возвращает неопределенное - PullRequest
2 голосов
/ 07 ноября 2011

В настоящее время я связываю файл javascript с html-страницей, и после использования функции в этом файле javascript возвращаемое значение по существу стирается и отображается как неопределенное, даже если в самой функции определено значение (которое, вероятно,очень запутанно, я просто покажу код и это должно иметь смысл):

functions.js

function addActivity(contactNameSelected, username) {   
var returnArray = [];
//post to .php
        if(data.added)
        {
            var newEvent = [];
            newEvent['id'] = data.id;
            newEvent['date'] = formattedDate;
            returnArray.push(true);
            returnArray.push(newEvent);
            return returnArray; //when i debug, this has a value and is a valid array at this point
        }
        else
        {
            returnArray.push(false);
            returnArray.push(data.message); //when i debug, this has a value and is a valid array at this point
            return returnArray;
       }
    }

home.html

var response = [];
response = addActivity(contactNameSelected, username); //although valid above, undefined here
if(response[0]) //error b/c response is undefined
{
    //do stuff if successful 
}
else{
    //do other stuff if unsuccessful
}

Если я простовернуть строку, она работает нормально, но по какой-то причине, если я пытаюсь вернуть массив, он просто не определен.Почему это?

Спасибо!

1 Ответ

2 голосов
/ 07 ноября 2011

Я предполагаю, что пропущенный '//post to .php' выглядит примерно так:

$.post('...php', { ... }, function(data) {
   if (data.added) ...

Ответ AJAX обрабатывается функцией обратного вызова , которая выполняется асинхронно.Другими словами, returnArray заполняется задолго после возвращения addActivity.

Операторы return returnArray; бесполезны, поскольку вы возвращаете значение из обратного вызова , а не из addActivity.Обратный вызов вызывается не вашим кодом, а XHR (в другом контексте выполнения ), и его возвращаемое значение отбрасывается.

Чтобы правильно передать ваши данные обратно в асинхронном стиле, нам нужнонастроить ваш код.

function addActivity(contactNameSelected, username, callback) {                           
    $.post('...', { ... }, function(data) {
        var returnArray=[];
        if(data.added)                        
        {                        
            ...
        }                        
        else                        
        {                        
            ...                      
        }
        callback(returnArray);
    });
}

addActivity(contactNameSelected, username, function(response) {
    if(response[0])
    {                                
        ...
    }                                
    else
    {                                
        ...
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...