异步htpp请求带来的困惑

来源:10-10 hidden不会触发组件的detached,但wxif会

卖女孩的小男孩_

2018-08-10

在做自己demo的过程中遇到了一个问题。


在app.js中定义了globalData,然后在app.js的onLaunch中发送http请求,把请求的响应结果赋值给globalData,在另外一个组件中要使用globalData时取到的都是空值,这是因为请求异步,数据的请求完成是要晚于组件加载的,那么怎么能够在组件中取得请求赋值之后的globalData值?


(产生问题的原因是想尽量减少http请求,demo中一共有三个页面,发送一次http请求就可以取到三个页面所有需要的数据。所以打算只在小程序加载时发送http请求,然后在三个页面中使用,上面问题中的globalData是为了解决页面之间传值的问题,或者有没有其他方案?)


谢谢解答!!

写回答

3回答

runzx

2018-08-10

因为小程序异步加载流程, 你首页不结束是不会转到http请求处理的,所以方法:

1。 在首页里发起http请求,而不是在app.js里。这样在回调函数里加载数据。

2。app.js的http请求成功回调函数里,最后一行加入跳转首页。 而首页里判断globalData若空就什么都不干,等http来再次激活首页。

1
1
卖女孩的小男孩_
谢谢同学! 我在app.js中发http请求,然后在需要数据的页面中根据globalData是否存在设置回调函数处理数据,解决了问题。 谢谢!
2018-08-10
共1条回复

卖女孩的小男孩_

提问者

2018-08-12

我使用的方法是这一种。 index中使用app.js请求的数据: 

index.js

// 设置一个测试数据,用于判断app.js中的http请求是否已经获取到数据
const testVal = app.globalData.dis

if (testVal && testVal != '') {
this.setData(app.globalData)
} else {

// 如果测试数据的值仍然为初始值 空字符串,则在app上定义一个回调函数
// 用于在http请求获取数据成功的回调函数中执行此回调函数
app.handleIndex = (res) => {
this.setData(app.globalData)
}
}

 app.js请求成功时 

// 判断页面中处理数据的回调函数是否存在,存在则执行 
this_.handleIndex && this_.handleIndex(res)


0
2
卖女孩的小男孩_
回复
runzx
之前的代码里http请求这一块用了多层success嵌套,所以this_是用于保存指向的。 后面用promise重构了这一块的代码,现在没有用this_了。
2018-08-12
共2条回复

runzx

2018-08-12

还有一种方法,在app.js里异步请求回调中加上一句,例:

if (this.userInfoReadyCallback) {
    this.userInfoReadyCallback(res)
}

然后在首页里判断如果数据为空,则把setData()放到上面全局变量里,让app.js里异步回调来实现数据捆绑:

//页面开始时
const app = getApp()
...
app.userInfoReadyCallback = res => {
    this.setData({
        userInfo: res.userInfo,
    })
}

因为app.js的异步回调一定是在首页的基本生命周期函数执行完后才运行,所以首面里给app.userInfoReadyCallback 赋值为所需处理数据的函数。

这方法比重新跳转首页效率高。

0
2
卖女孩的小男孩_
不支持markdown好尴尬,我写成回复在上面了
2018-08-12
共2条回复

纯正商业级微信小程序应用实战,全方位小程序特性讲解

真实数据的高质量小程序项目,学会直接工作

4782 学习 · 2125 问题

查看课程