Javascript ES6KOA.JS运行生成器函数异步完成和返回 使用KOA.JS,我想制作一个API,它运行一个在后台运行很长时间的生成器函数,但是立即将令牌返回给用户。
然后,用户可以使用该令牌稍后检索其作业的状态Javascript ES6KOA.JS运行生成器函数异步完成和返回 使用KOA.JS,我想制作一个API,它运行一个在后台运行很长时间的生成器函数,但是立即将令牌返回给用户。,javascript,node.js,generator,ecmascript-6,koa,Javascript,Node.js,Generator,Ecmascript 6,Koa,然后,用户可以使用该令牌稍后检索其作业的状态 'use strict'; var generateToken = function(){ //... }; var processData = function *(data, token) { //... var a = yield analysis(data); console.log(a) // a is undefined }; app.post('/process_data', validate, fu
'use strict';
var generateToken = function(){
//...
};
var processData = function *(data, token) {
//...
var a = yield analysis(data);
console.log(a) // a is undefined
};
app.post('/process_data', validate, function *(next) {
var token = generateToken();
var that = this;
setTimeout(function() {
for (var i of processData(that.request.body, token)){
continue;
}
});
this.body = "this should return immediately " + token;
return next;
});
在setTimeout内运行时,变量“a”未保存。我如何构造它,使processData完全像正常产量一样运行?多亏了Bergi的解决方案
app.post('/process_data', validate, function *(next) {
var token = generateToken();
co(processData(this.request.body, token));
this.body = "this should return immediately " + token;
return next;
});
感谢Bergi提供的解决方案
app.post('/process_data', validate, function *(next) {
var token = generateToken();
co(processData(this.request.body, token));
this.body = "this should return immediately " + token;
return next;
});
感谢Bergi提供的解决方案
app.post('/process_data', validate, function *(next) {
var token = generateToken();
co(processData(this.request.body, token));
this.body = "this should return immediately " + token;
return next;
});
感谢Bergi提供的解决方案
app.post('/process_data', validate, function *(next) {
var token = generateToken();
co(processData(this.request.body, token));
this.body = "this should return immediately " + token;
return next;
});
您可能希望让长时间运行的进程由作业队列(如 您可以使用http post将作业排队 然后使用http get检查作业 以下是我认为你想做的事情的大致轮廓:
var kue = require('kue'),
koa = require('koa'),
route = require('koa-router'),
thunkify = require('thunkify'),
parse = require('co-body'),
co = require('co'),
app = koa(),
jobs = kue.createQueue();
app.use(route(app));
// turn callbacks into thunks for generators
var createJob = thunkify(jobs.create);
var findJob = thunkify(kue.Job.get);
// Process the job here
jobs.process('longProcess', function(job, done){
// do work in here
// call done(err) when completed
// EDIT: if you want to handle job using generators/yield
// you could use a library like co
co(function *(){
var qs = yield doWork(job.data);
done();
}).error(done);
});
// Queue/Start the Job here
app.post('/jobs', function *(){
var body = yield parse(this);
var job = yield createJob('longProcess', body);
this.body = job.id;
});
// Check Status of job here
app.get('/jobs/:token', function *(){
var job = yield findJob(this.params.token);
this.body = job;
// job.status === 'complete' || ...
});
app.listen(3000);
您可能希望让长时间运行的进程由作业队列(如 您可以使用http post将作业排队 然后使用http get检查作业 以下是我认为你想做的事情的大致轮廓:
var kue = require('kue'),
koa = require('koa'),
route = require('koa-router'),
thunkify = require('thunkify'),
parse = require('co-body'),
co = require('co'),
app = koa(),
jobs = kue.createQueue();
app.use(route(app));
// turn callbacks into thunks for generators
var createJob = thunkify(jobs.create);
var findJob = thunkify(kue.Job.get);
// Process the job here
jobs.process('longProcess', function(job, done){
// do work in here
// call done(err) when completed
// EDIT: if you want to handle job using generators/yield
// you could use a library like co
co(function *(){
var qs = yield doWork(job.data);
done();
}).error(done);
});
// Queue/Start the Job here
app.post('/jobs', function *(){
var body = yield parse(this);
var job = yield createJob('longProcess', body);
this.body = job.id;
});
// Check Status of job here
app.get('/jobs/:token', function *(){
var job = yield findJob(this.params.token);
this.body = job;
// job.status === 'complete' || ...
});
app.listen(3000);
您可能希望让长时间运行的进程由作业队列(如 您可以使用http post将作业排队 然后使用http get检查作业 以下是我认为你想做的事情的大致轮廓:
var kue = require('kue'),
koa = require('koa'),
route = require('koa-router'),
thunkify = require('thunkify'),
parse = require('co-body'),
co = require('co'),
app = koa(),
jobs = kue.createQueue();
app.use(route(app));
// turn callbacks into thunks for generators
var createJob = thunkify(jobs.create);
var findJob = thunkify(kue.Job.get);
// Process the job here
jobs.process('longProcess', function(job, done){
// do work in here
// call done(err) when completed
// EDIT: if you want to handle job using generators/yield
// you could use a library like co
co(function *(){
var qs = yield doWork(job.data);
done();
}).error(done);
});
// Queue/Start the Job here
app.post('/jobs', function *(){
var body = yield parse(this);
var job = yield createJob('longProcess', body);
this.body = job.id;
});
// Check Status of job here
app.get('/jobs/:token', function *(){
var job = yield findJob(this.params.token);
this.body = job;
// job.status === 'complete' || ...
});
app.listen(3000);
您可能希望让长时间运行的进程由作业队列(如 您可以使用http post将作业排队 然后使用http get检查作业 以下是我认为你想做的事情的大致轮廓:
var kue = require('kue'),
koa = require('koa'),
route = require('koa-router'),
thunkify = require('thunkify'),
parse = require('co-body'),
co = require('co'),
app = koa(),
jobs = kue.createQueue();
app.use(route(app));
// turn callbacks into thunks for generators
var createJob = thunkify(jobs.create);
var findJob = thunkify(kue.Job.get);
// Process the job here
jobs.process('longProcess', function(job, done){
// do work in here
// call done(err) when completed
// EDIT: if you want to handle job using generators/yield
// you could use a library like co
co(function *(){
var qs = yield doWork(job.data);
done();
}).error(done);
});
// Queue/Start the Job here
app.post('/jobs', function *(){
var body = yield parse(this);
var job = yield createJob('longProcess', body);
this.body = job.id;
});
// Check Status of job here
app.get('/jobs/:token', function *(){
var job = yield findJob(this.params.token);
this.body = job;
// job.status === 'complete' || ...
});
app.listen(3000);
我想你会想直接使用你是对的。谢谢我想你会想直接使用你是对的。谢谢我想你会想直接使用你是对的。谢谢我想你会想直接使用你是对的。谢谢您可以简化为
co(processData(this.request.body,token))
。不需要匿名生成器表达式。Afaik您可以简化为co(processData(this.request.body,token))
。不需要匿名生成器表达式。Afaik您可以简化为co(processData(this.request.body,token))
。不需要匿名生成器表达式。Afaik您可以简化为co(processData(this.request.body,token))
。不需要匿名生成器表达式。如果要让位于jobs.process回调中的另一个进程,该怎么办?你会怎么做?你的意思是使用生成器/收益率等吗?是的,我如何向生成器屈服,然后将生成器返回的结果发送回去,例如:var jobs=kue.createQueue();jobs.process('questions',function(job,done){var gen=questions(job.data);var a=gen.next();job.send(a);done();});函数*问题(数据){var Qs=屈服*过程问题(数据);} < /C> >其中Purress问题是另一个代母,可以使用生成流控制库,如代码“CO/<代码> >,这是膝关节炎使用的。有关示例,请参见编辑后的答案。如果您想让位于jobs.process回调中的另一个进程,该怎么办?你会怎么做?你的意思是使用生成器/收益率等吗?是的,我如何向生成器屈服,然后将生成器返回的结果发送回去,例如:var jobs=kue.createQueue();jobs.process('questions',function(job,done){var gen=questions(job.data);var a=gen.next();job.send(a);done();});函数*问题(数据){var Qs=屈服*过程问题(数据);} < /C> >其中Purress问题是另一个代母,可以使用生成流控制库,如代码“CO/<代码> >,这是膝关节炎使用的。有关示例,请参见编辑后的答案。如果您想让位于jobs.process回调中的另一个进程,该怎么办?你会怎么做?你的意思是使用生成器/收益率等吗?是的,我如何向生成器屈服,然后将生成器返回的结果发送回去,例如:var jobs=kue.createQueue();jobs.process('questions',function(job,done){var gen=questions(job.data);var a=gen.next();job.send(a);done();});函数*问题(数据){var Qs=屈服*过程问题(数据);} < /C> >其中Purress问题是另一个代母,可以使用生成流控制库,如代码“CO/<代码> >,这是膝关节炎使用的。有关示例,请参见编辑后的答案。如果您想让位于jobs.process回调中的另一个进程,该怎么办?你会怎么做?你的意思是使用生成器/收益率等吗?是的,我如何向生成器屈服,然后将生成器返回的结果发送回去,例如:var jobs=kue.createQueue();jobs.process('questions',function(job,done){var gen=questions(job.data);var a=gen.next();job.send(a);done();});函数*问题(数据){var Qs=屈服*过程问题(数据);} < /C> >其中Purress问题是另一个代母,可以使用生成流控制库,如代码“CO/<代码> >,这是膝关节炎使用的。有关示例,请参见编辑后的答案。