小程序异步请求

编程

小程序异步请求

写小程序的时候有一个功能场景:依次上传列表中的文件,然后将网络地址返回,再将这些文件的网络链接上传到服务器。大概是下面这个过程

1
2
3
4
filelist[file1, file2, file3, file4];
upload file in filelist,
urlList ["http://file1url", "http://file2url", "http://file3url", "file4url"]
upload urlList

但是一直调试不对,因为在调试的时候,上传链接的时候,上传的urlList是一个空数组,但是在控制台输出urllist确是正常的。

debug两小时以后终于发现端倪

小程序的wx.request() 方法是异步请求。所以在uoload filelist的时候,导致还没有上传完成就取执行后面的upload urllist。这个时候urllist当然为空。

问题代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
list:["file1","file2"];
urlList:[];
for (var i = 0; i < list.length;i++){
wx.request({
url: http_config.getUserDetail,
data: list[file1];
success: (res) => {
console.log("file success");
urlList.push(res.url);
},
fail:()=>{
console.log("file fail")
}
})
}
上一个请求异步请求,还没有完成就已经执行到这里了
所以 urllist为[] 空
wx.request({
url: http_config.getUserDetail,
data: urlList;
success: (res) => {
console.log("url success");
urlList.push(res.url);
},
fail:()=>{
console.log("url fail")
}
})

一番查询之后,网上说用 promise

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 单独放到一个函数
getImgUrl:function(url){
return new Promise(function (resolve, reject){
weRequest.uploadFile({
这里请求
success(e) {
console.log("我在请求成功内!");
resolve(e.url)
},
fail(e){
reject("上传图片失败");
}
})
})
},
function(e){}
for (var i = 0; i < list.length; i++) {
this.getImgUrl(list[i])
.then((res) => {
console.log("我是请求成功 then")
}).catch((res) => {
console.log("我请求失败 catch")
})
}

wx.request({
在这里请求
})
}

运行结果,,依然错误,

感觉promise 是一个较无用的封装,因为,在整个request里面,他仍然是异步的,只是在请求体内,then 和catch 一定是在请求完成后执行。

其实这和request请求完成后success()和fail(),compelete() 回填方法是一样的。只是封装成为then,catch,看上去稍微好一点罢了。所以。在请求的时候,还是乖乖用回调方法好了。

Author: 哒琳

Permalink: http://blog.jieis.cn/2021/dbb6fa25-2e52-46a5-be7f-c43bb0d95f30.html

Comments