2016-04-01 2 views
0

Peep всегда возвращается из функции как неопределенный. Может кто-то указать мне на проблему? В функции успеха моментальный снимок возвращается, как и ожидалось. Я думаю, что это проблема.Firebase возвращает моментальный снимок, но не может получить доступ к значению

function getPerson(id) { 

    var ref = new Firebase("https://foo.firebaseio.com/people/" + id), 
    peep; 

    // Attach an asynchronous callback to read the data at our people reference 
    ref.once("value", function(snapshot) { 
     //success 
     peep = snapshot; 

    }, function (errorObject) { 
     //error 
     //console.log("The read failed: " + errorObject.code); 
    }); 

    return peep; 

} 
+0

См http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

ответ

3

один раз() метод асинхронный, поэтому используется обратный вызов. Вы можете передать обратный вызов в качестве параметра в getPerson function вместе с идентификатором.

function getPerson(id, callback) { 
    var ref = new Firebase("https://foo.firebaseio.com/people/" + id); 

    ref.once("value", function(snapshot) { 
    var peep = snapshot; 
     // error will be null, and peep will contain the snapshot 
     callback(null, peep); 
    }, function (error) { 
     // error wil be an Object 
     callback(error) 
    }); 
} 

getperson('9234342', function (err, result) { 
    console.log(result); 
}); 
1

once() метод асинхронной поэтому обратный вызов используется. Вы возвращаете peep, прежде чем он даже получит значение. Вы должны вернуть peep после того, как он определен в обратном вызове.

function getPerson(id) { 

    var ref = new Firebase("https://foo.firebaseio.com/people/" + id), 
    peep; 

    // Attach an asynchronous callback to read the data at our people reference 
    return ref.once("value", function(snapshot) { 
     //success 
     peep = snapshot; 
     return peep; 
    }, function (errorObject) { 
     //error 
     //console.log("The read failed: " + errorObject.code); 
    }); 
} 

И затем использовать его как это:

getPerson('9234342').then(function(snapshot) { 
    console.log(snapshot.val()); 
}).catch(function(error) { 
    console.error(error); 
}); 
+0

Это 'возвращение peep' все еще не будет работать. См. Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call –

+0

Заметил мою ошибку и отредактировал. Благодаря! – Maverick976

+0

Извините, но это все равно не сработает. «Return peep» возвращает значение, но никто не ждет этого значения. Если хотите, вы можете вернуть обещание. Просто 'return ref.once (" value ")'. –

2

Да это должно быть потому, что обратный вызов не немедленно уволен. Он получает данные, затем попадает в него.

Попробуйте вернуть peep внутри обратного вызова.

return ref.once("value", function(snapshot) { 
     //success 
     peep = snapshot; 
     return peep; 

    }, function (errorObject) { 
     //error 
     //console.log("The read failed: " + errorObject.code); 
    }); 

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