访问从JavaScript中的另一个函数返回的数据

时间:2017-08-22 13:07:40

标签: javascript asynchronous promise return

我正在尝试从另一个函数返回的承诺。这是我的代码:

function getData(){
var result = [];
return new Promise(function(resolve){
var query = firebase.database().ref('groups');
query.once('value').then(data => {
    data.forEach(snapshot => {

        var gdata = snapshot.val();
        var grp = snapshot.key;
        result.push(grp);
    });
});
resolve(result);
});
}

我设法从上面的函数中打印出'grp'变量的数据。在我的第二个功能中,我试图访问promise中返回的数据:

但是,从第二个函数开始,当我尝试在.then()中打印时,实际上没有打印出任何内容。为什么会这样?

谢谢!

4 个答案:

答案 0 :(得分:1)

首先,firebase已经返回一个Promise,因此不需要创建一个新的。您应该将数据放入结果中并直接返回承诺。

function getData() {
    var query = firebase.database().ref('groups');
    return query.once('value').then(data => {
        let res = [];
        data.forEach(snapshot => {
            var gdata = snapshot.val();
            var grp = snapshot.key;
            res.push(grp);
        });
        return res;
    });
}

然后您可以简单地链接

function plotData() {
    return getData().then(data => {
        data.forEach(console.log);
    });
}

答案 1 :(得分:0)

你太早解决了这个承诺。但是,如果您不需要,请不要创造新的承诺:

cv2.transform()

答案 2 :(得分:0)

坏消息:如果你需要使用.then()函数来获取你想要的值(就像你的firebase方法一样),那么你从你的函数返回一个promise。甚至对于你的内在功能也是如此。

好消息是.then()可以用来转换"函数的返回值;甚至会为你解开退回的承诺(如果你决定在得到你的答案之前你需要再次进行数据库调用)

function getData(){
    var query = firebase.database().ref('groups');
    return query.once('value').then(data => {
        var result = [];
        data.forEach(snapshot => {

            var gdata = snapshot.val();
            var grp = snapshot.key;
            result.push(grp);
        });
        return result;
    });
    resolve(result);
}

请注意我return result函数中的.then()。由于我返回了.then()的结果,因此我们将评估一个承诺,而不是纯粹返回data,将返回result

我不太确定你在第二个街区做了些什么。你不应该在getData周围需要Promise.allmap,除非你真的打算多次调用它;如果你的清单是空的,似乎根本没有被调用。

免责声明:我很了解承诺概念,但不知道firebase。如果firebase有独特的方面来改变它应该如何工作,我可能是错的。

答案 3 :(得分:-1)

list.map()没有解决,它不是一个承诺...... Promise.all需要收到一个承诺。

你可能想在那里调用 getData()