co执行generator函数,如何在多个co函数都返回之后再返回数据?

发布于 2022-09-07 15:52:43 字数 1526 浏览 18 评论 0

let form = new multiparty.Form({
                encoding: 'utf-8',
                // uploadDir:"public/upload",  //文件上传地址
                keepExtensions: true  //保留后缀
            })
            form.parse(ctx.req, function (err, fields, files) {
                let data=[]
                for(let f of files.file){
                    // 文件名
                    let date = new Date()
                    let time = '' + date.getFullYear() + (date.getMonth() + 1) + date.getDate()
                    let filepath = 'project/'+time + '/' + date.getTime()
                    let fileext = f.originalFilename.split('.').pop()
                    let upfile = f.path
                    let newfile = filepath + '.' + fileext
                    //ali-oss
                    co(function*() {
                        client.useBucket('p-adm-test')
                        let result = yield client.put(newfile, upfile)
                        console.log('文件上传成功!', result.url)
                        data.push(result.url)
                        console.log(data)
                        resolve()
                    }).catch(function(err) {
                        console.log(err)
                    })
                }
                ctx.response.type = 'json'
                ctx.response.body = {
                    errno: 0,
                    data: data
                }
            })

如上代码,我多次执行了co函数,希望每次执行的时候返回的结果push到data数组里,最后返回到前端的数据是多次执行之后的data,但是前端收到的只是第一次返回的data,如何解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云归处 2022-09-14 15:52:43

co返回的也是promise 按照你这种返回数组可以用promise.all

var fn = co.wrap(function*(newfile, upfile) {
  client.useBucket("p-adm-test");
  let result = yield client.put(newfile, upfile);
  return result.url;
});

1 . promise.all

var arr = []
for(let f of files.file){
    arr.push(fn(newfile,upfile))
}
//Promise.all(arr,function(res){
Promise.all(arr).then(function(res){
    ctx.response.body = {
        errno: 0,
        data: res
    }
})

2 . co嵌套


form.parse(ctx.req, co.warp(function* (err, fields, files) {
    let data = []
    for(let f of files.file){
        let res = yield fn(newfile,upfile)
        data.push(res)
    }
    ctx.response.body = {
        errno: 0,
        data: data
    }
}))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文