JS 的回调函数的结果为Object,但是无法使用,只能在console.log中可见

JagnDC 2019-03-04 10:52:44
刚开始学习electron和angularjs,我这里从数据库获取的结果通过回调函数得到结果,但是格式却是[object Object],用了js对象的方法没有办法得到其中values的数据,请问各位大佬,我是不是有什么地方理解的不对,或者写错了,请教各位前辈,感谢~


...全文
1502 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
JagnDC 2019-03-06
  • 打赏
  • 举报
回复
引用 23 楼 ilulingu的回复:
[quote=引用 20 楼 JagnDC 的回复:] [quote=引用 17 楼 ilulingu的回复:]我没用过, electron和angularjs , 但我看你代码还有控制台打印出来的信息, 我想问一下, 控制台第三行的“object”是在find方法里面“console.log(typeOf(datas));”这个部分打印出来的吗? 控制台最后一行是在getPage里面“console.log(m)”中打印出来的吗?如果是的话,你刚才说的问题就正常了。
你好,确实是这些输出的,请问为什么说问题就正常了,是应该会出现这种问题吗?谢谢回答~[/quote] 首先, find方法里面, “dbservice.find”是一个回调函数的方法,这个方法是异步的,所以你在执行“dbservice.find”外部代码的时候此时“dbservice.find”其实是还没执行完毕的,这应该是一个服务端的异步请求,具体返回时间需要看网络等因素。所以此一次console.log中的输出只是当初实例化={}的空对象。 接下来第二次你就很好奇为什么会有输出对象的值,因为在方法调用之前使用了一个“await”的关键字,这个关键字起到了同步的作用,会将你当前的方法执行完毕之后再返回。所以才会出现了你上面的那些问题。 我不太明白你的业务需求是什么,如果你要在find里面去做业务处理,第一可以在“dbservice.find”里面去处理,或者你可以试试在dbservice.find外面加上“await”关键字将方法改成同步执行。因为“await”我还没用过,估计他的用法也是大同小异。[/quote] 我觉得你说的非常好,我已经理解了,只要在回调函数中利用返回的数据就可以使用了!但是之前的方法我还在思考怎么实现,先在这里感谢大家!
qq_44684839 2019-03-05
  • 打赏
  • 举报
回复
马爸爸为了抢腾老板用户量也是大放血了,支苻宝首页顶部搜索栏输入6912851这几个数,然后点那个荭包,最低有8元,最高188,低于8元的你可以来叼我!楼主今天領到36.8嘿嘿!
JagnDC 2019-03-05
  • 打赏
  • 举报
回复
引用 21 楼 kerryszy的回复:
thanks
你好,请问有什么想法嘛,向大家学习~
kerryszy 2019-03-05
  • 打赏
  • 举报
回复
thanks
JagnDC 2019-03-05
  • 打赏
  • 举报
回复
引用 17 楼 ilulingu的回复:
我没用过, electron和angularjs , 但我看你代码还有控制台打印出来的信息, 我想问一下, 控制台第三行的“object”是在find方法里面“console.log(typeOf(datas));”这个部分打印出来的吗? 控制台最后一行是在getPage里面“console.log(m)”中打印出来的吗?如果是的话,你刚才说的问题就正常了。
你好,确实是这些输出的,请问为什么说问题就正常了,是应该会出现这种问题吗?谢谢回答~
JagnDC 2019-03-05
  • 打赏
  • 举报
回复
引用 14 楼 桂浮云 的回复:
或者,照猫画虎,改了一个,不知道行不行:

return {
    connect: function(info) {
        SQLService.connect(info);
        SQLService.test();
    },
    getPager: function(table) {
        return new Promise(function(resolve, reject) {
            var datas = {};
            SQLService.find(table, function(err, results) {
                datas.values = results;
            });

            console.log(typeof(datas));
            resolve(datas);
        });
    }
};
我来理解你的想法了,但是还是一样的哎,我觉得从find回调出来之后的datas就已经是object了,好像没什么办法了
ilulingu 2019-03-05
  • 打赏
  • 举报
回复
我没用过, electron和angularjs , 但我看你代码还有控制台打印出来的信息, 我想问一下, 控制台第三行的“object”是在find方法里面“console.log(typeOf(datas));”这个部分打印出来的吗? 控制台最后一行是在getPage里面“console.log(m)”中打印出来的吗?如果是的话,你刚才说的问题就正常了。
ilulingu 2019-03-05
  • 打赏
  • 举报
回复
引用 20 楼 JagnDC 的回复:
[quote=引用 17 楼 ilulingu的回复:]我没用过, electron和angularjs , 但我看你代码还有控制台打印出来的信息, 我想问一下, 控制台第三行的“object”是在find方法里面“console.log(typeOf(datas));”这个部分打印出来的吗? 控制台最后一行是在getPage里面“console.log(m)”中打印出来的吗?如果是的话,你刚才说的问题就正常了。
你好,确实是这些输出的,请问为什么说问题就正常了,是应该会出现这种问题吗?谢谢回答~[/quote] 首先, find方法里面, “dbservice.find”是一个回调函数的方法,这个方法是异步的,所以你在执行“dbservice.find”外部代码的时候此时“dbservice.find”其实是还没执行完毕的,这应该是一个服务端的异步请求,具体返回时间需要看网络等因素。所以此一次console.log中的输出只是当初实例化={}的空对象。 接下来第二次你就很好奇为什么会有输出对象的值,因为在方法调用之前使用了一个“await”的关键字,这个关键字起到了同步的作用,会将你当前的方法执行完毕之后再返回。所以才会出现了你上面的那些问题。 我不太明白你的业务需求是什么,如果你要在find里面去做业务处理,第一可以在“dbservice.find”里面去处理,或者你可以试试在dbservice.find外面加上“await”关键字将方法改成同步执行。因为“await”我还没用过,估计他的用法也是大同小异。
qq_32152651 2019-03-04
  • 打赏
  • 举报
回复
JSON.stringfy(data.values)
JagnDC 2019-03-04
  • 打赏
  • 举报
回复
引用 3 楼 讨厌走开啦 的回复:
要这么遍历:for(var key in data.values) {...}
讨厌走开啦 2019-03-04
  • 打赏
  • 举报
回复
要这么遍历:for(var key in data.values) {...}
JagnDC 2019-03-04
  • 打赏
  • 举报
回复
即使我将它转为数组也没有值
JagnDC 2019-03-04
  • 打赏
  • 举报
回复
桂浮云 2019-03-04
  • 打赏
  • 举报
回复
或者,照猫画虎,改了一个,不知道行不行:

return {
    connect: function(info) {
        SQLService.connect(info);
        SQLService.test();
    },
    getPager: function(table) {
        return new Promise(function(resolve, reject) {
            var datas = {};
            SQLService.find(table, function(err, results) {
                datas.values = results;
            });

            console.log(typeof(datas));
            resolve(datas);
        });
    }
};
桂浮云 2019-03-04
  • 打赏
  • 举报
回复
照着教程仿了一个,在Chrome72.0.3626.119上测试发现返回的确实是object,但其他的没有发现问题,是否可以考虑是electron解释的问题:


function resolveAfter2Seconds() {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve([
                {
                    name: '阿ad'
                },
                {
                    name: '啊的'
                },
                {
                    name: 'aaf'
                }
            ]);
        }, 2000);
    });
}

async function asyncCall() {
    console.log('calling');
    var m = await resolveAfter2Seconds();
    console.log(m);
    // expected output: 'resolved'
    return m;
}

a = asyncCall();

a.then(function($v) {
    console.log(typeof($v));    // 这块显示为object
    console.log(JSON.stringify($v));
    console.log($v.length);
    console.log($v[0]);
});
显示结果大致如下:

(3) [{…}, {…}, {…}]0: {name: "阿ad"}1: {name: "啊的"}2: {name: "aaf"}
length: 3
__proto__: Array(0)
(index):170 object
(index):171 [{"name":"阿ad"},{"name":"啊的"},{"name":"aaf"}]
(index):172 3
(index):173 {name: "阿ad"}name: "阿ad"__proto__: Object
JagnDC 2019-03-04
  • 打赏
  • 举报
回复
引用 9 楼 天际的海浪 的回复:

for (var i = 0; i < data.values.length; i++) {
	var str = data.values[i].name;
	console.log(str);
}

不行哎,读不出来长度
桂浮云 2019-03-04
  • 打赏
  • 举报
回复
引用 10 楼 桂浮云 的回复:
[quote=引用 8 楼 JagnDC 的回复:] [quote=引用 7 楼 桂浮云 的回复:] 没有接触过electron和angularjs,但对getPager函数的理解,它的返回值不是Promise对象,怎么可以用then呢?
不是呀,那个getPager函数是我在.factory里面自定义的async函数,所以返回的是promise对象[/quote] getPager函数里,await的时候应该就已经把数据取出并赋值给m了吧;我对Promise对象掌握的还不是很熟,觉得即便返回的是promise对象,如果都已经通过await取过了,那么再通过then也不能返回数据了。水平有限,批评指正。[/quote] await掌握的不好,如何解决同关注
桂浮云 2019-03-04
  • 打赏
  • 举报
回复
引用 8 楼 JagnDC 的回复:
[quote=引用 7 楼 桂浮云 的回复:] 没有接触过electron和angularjs,但对getPager函数的理解,它的返回值不是Promise对象,怎么可以用then呢?
不是呀,那个getPager函数是我在.factory里面自定义的async函数,所以返回的是promise对象[/quote] getPager函数里,await的时候应该就已经把数据取出并赋值给m了吧;我对Promise对象掌握的还不是很熟,觉得即便返回的是promise对象,如果都已经通过await取过了,那么再通过then也不能返回数据了。水平有限,批评指正。
天际的海浪 2019-03-04
  • 打赏
  • 举报
回复

for (var i = 0; i < data.values.length; i++) {
	var str = data.values[i].name;
	console.log(str);
}

JagnDC 2019-03-04
  • 打赏
  • 举报
回复
引用 7 楼 桂浮云 的回复:
没有接触过electron和angularjs,但对getPager函数的理解,它的返回值不是Promise对象,怎么可以用then呢?
不是呀,那个getPager函数是我在.factory里面自定义的async函数,所以返回的是promise对象
加载更多回复(2)

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧