原函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
cos.postObject({
Bucket: config.Bucket,
Region: config.Region,
Key: Key,
FilePath: filePath,
}, function (err, data) {
if (err) {
wx.showToast({ title: '上传图片错误', icon: 'none' })
console.log(err);
return;
}
wx.showToast({ title: '上传图片成功', icon: 'success' })
});

改造后:

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
30
31
32
33
34
35
36
37
38
39
40
async function saveToCOS(filePath) {
const result = {ok: true, data: ""}
var Key = util.getRandFileName(filePath);

function cosPostObject(resolve, reject) {
cos.postObject({
Bucket: config.Bucket,
Region: config.Region,
Key: Key,
FilePath: filePath,
}, function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
}

function errorHandler(err) {
result.ok = false
result.data = err
}

const res = await new Promise(cosPostObject).catch(errorHandler)

if (res) {
result.ok = true
result.data = res
}
return result
}

// caller
const res = await saveToCOS(...)
if (res.ok) {
//...
} else {
//...
}

Update

原来可以这么写:

1
2
3
async function foo() {
return await rp('http://googe.com').then(() => {ok: true}).catch(() => {ok: false})
}

之前以为只能这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async function foo() {
const result = {}

function errorHandler(err) {
result.ok = false
result.data = err
}

const res = await rq('http://googe.com').catch(errorHandler)

if (res) {
result.ok = true
result.data = res
}
return result
}