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

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,如何解决?

阅读 2.8k
1 个回答

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
    }
}))
推荐问题