用for循环使用request-promise模块请求接口,得到返回数据加入到JSON对象,JSON对象显示为空?
发布于 3 个月前 作者 yss1993 834 次浏览 来自 问答

问题如标题,JSON对象显示为空,但console.log出来的数据点开却显示内部有值。 QQ截图20180518151100.png 代码如下: code.png 希望大家能给我一个指导,对这个问题是在是头疼不已!谢谢

18 回复

劳请大神看下是怎么回事

是不是我写的太过简单粗暴连编译器都看不下去了 哈哈

你的请求发出去之后你就打印了结果集,但是此时请求还未返回,所以刚开始打印出来的结果集是空的,然后,你打开结果集时,请求的数据已经回来,所以展开就有喽。

我瞎猜的

@tjru promise将异步形式的代码写成了同步形式的代码 难道代码运行还是异步的吗?

你要用递归,用for写是错误的

@yahue 好的 我也是这样感觉 我重新修改代码吧

for 里面是异步的,console.log()是在then外面执行的,所以,下面的console先执行了. 建方看下JS 的异步操作,结合你的代码,简单写了几句: image.png

image.png

这里没有递归, 都是Promise, 如果是递归的话,那还用什么ES6

@LeoChowChina 多谢楼主!问题已经解决了!本来我的想法也是promise.all,但是一直组织不出来方法!顺便多问一句,楼主是怎么学习的?我一直梦想做一个大神 但是水平一直没什么长进! promise.png

json: true 要设置成这样,要不然就是文本

@htoooth 好的 谢谢!

@yss1993 这个多写啊。我一天除了上班还写2个小时左右的代码。和读书百遍,其义自现是一样的,这只是我的拙见,我也很菜的,只是这里正好是我会的。另外,你的需要在getAllWeather return Promise.resolve吗?我觉得可以直接return promises.然后下面就直接Promise.all(promises).then,可以少包一层。

还可以包得更少:

在getAllWeather里直接return Promise.all(pormises) 这里注意一个拼写,我看你这样写的就这样写了。 然后呢,在下面就可以直接getAllWeather.then(resp=> {})

另外你一直问的楼主

@LeoChowChina 敲代码敲快了 拼写没注意到 嘿嘿!promise.all的iterator没法定义为对象,我还是选择用async.series,我需要把areaidArr内的值一块使用request返回回去,后面我还需要用到!谢谢你了哈!

像你写的这种情况是不适合用async和await去写的,很容易搞成串行,效率极差,用promise.all是比较好的办法

@tjru 你说的已经很接近了@tjru

来自酷炫的 CNodeMD

@daileimail 您有什么高招吗?

@tjru 之所以用async是因为我要把areaidArr中的元素给带到下一步处理 但是promise.all仅支持数组 小弟才疏学浅 实在想不出有什么更好的办法了

@yss1993 我一般用bulebird的map来做异步循环

来自酷炫的 CNodeMD

回到顶部