ES6产生多个生成器

时间:2017-04-04 11:46:04

标签: javascript ecmascript-6

在ES6中,yield和generator函数允许等待一次函数执行。但我想等待多个发电机。 代码如下:

files.forEach(function* (file) {
    const uploadedFile = yield call([service, service.upload], file, config)
}

callredux-saga效果

  

为了表达Saga逻辑,我们从Generator生成纯JavaScript对象。我们称之为对象效果

我想一次性启动所有上传,无需等待上一次完成并等待所有文件上传后,是否可以使用yield

2 个答案:

答案 0 :(得分:6)

我一直在寻找的是:

// correct, effects will get executed in parallel
const [users, repos]  = yield [
  call(fetch, '/users'),
  call(fetch, '/repos')
]

call这里只是回复承诺

  

当我们产生一系列效果时,生成器会被阻塞,直到所有效果都被解决或者一旦被拒绝(就像Promise.all的表现一样)。

答案 1 :(得分:1)

您可以使用Promise.all()代替

示例:

如果要在完成所有上传后重新启动对代码的控制,可以使用async / await接口:

function uploadALL(files){
  const uploadedFilesPromises = files.map( file => {
    return call([service, service.upload], file 
  })        
  }
  return Promise.all(uploadedFilesPromises);
} 

// samples of using this function:
uploadALL(files).then((uploadedFiles)=> { ....  })
// or in async function you can use await:
const uploadedFiles = await uploadAll(files)

你的#34;电话"方法应该返回一个Promise对象,否则你必须将它包装到Promise中。