egg 如何后台执行某个任务?

小程序屏蔽了阿里云的OSS

所以程序的上传先传到应用服务器,返回成功代码和临时地址给前台,然后应用服务器在后台上传到阿里云oss,再写数据库,返回前台。

try {
          yield awaitWriteStream(stream.pipe(writeStream));
          yield this.ctx.service.updatefile.updateToss(target, upFileName, uid);
          return { code: 0, msg: '', data: tmpPath };
        } catch (err) {
          yield sendToWormhole(stream);
          throw err;
        }

这里是上传到应用服务器的

我的问题是,

yield this.ctx.service.updatefile.updateToss(target, upFileName, uid);

在updateToss这个function里,有一个update数据库动作,一个上传文件动作,都是yield。

这任务实际上是希望在后台执行的,所以那个return的问题应该如何处理,其实我是想把这句放到后台执行,不影响前台的。

尝试了on监视,但是不支持yield

try {
          yield awaitWriteStream(stream.pipe(writeStream));
          console.log(writeStream);
          writeStream.once('closed', () => {
            if (writeStream.finished === true) {
              yield this.ctx.app.service.updatefile.updateToss(target, upFileName, uid);
            }
          });
          writeStream.emit('closed');
          if (writeStream.closed) {
            return { code: 0, msg: '', data: tmpPath, oss: { target, upFileName, uid } };
          }
        } catch (err) {
          yield sendToWormhole(stream);
          throw err;
        }
阅读 6.8k
2 个回答

关于上传可以使用child_process开个子进程去做。
然后还可以监听子进程执行的状态来决定是否更改数据库的操作。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题