2015-07-06 2 views
0

Я пишу API io.js и Koa, и у меня есть маршрут GET, который я использую для передачи данных в API и немедленно возвращаю OK пользователю. В принципе, меня не волнует результат, который возвращает запрос GET, я просто хочу передать данные. Вот почему я хочу вернуть «ОК» клиенту, после чего он делает запрос GET как можно скорее, а затем обрабатывает данные из запроса.Koa GET возвращает результат немедленно клиенту и что-то делать после этого

Мой код до сих пор выглядит следующим образом:

app.use(route.get("/passData", function*(){ 
    this.body = "OK"; 
    yield doSomeWork(this.query); 
}); 

function *doSomeWork(query){ 
    // do work 
    // the code below should be triggered when the client receives the OK message 
} 

Есть ли способ сделать это?

+0

Если удалить '' yield' doSomeWork' является не выполняется. –

ответ

2

Вы не хотите yield на doSomeWork --that говорит Коа ждать, что это именно то, что вы делаете не хотите.

app.use(route.get("/passData", function*(){ 
    this.body = "OK"; 
    doSomeWork(this.query); // REMOVE YIELD 
}); 

Поскольку doSomeWork просто обычная старая асинхронная функция сейчас, это не должна быть генератором. (Если оставить * там, вы будете вызова генератора, который не делает абсолютно ничего, кроме как создать итератор, который затем будет выброшена.)

function doSomeWork(query){ // REMOVE ASTERISK 
    // do work 
    // the code below should be triggered when the client receives the OK message 
} 
+0

Есть ли способ сделать это, не удаляя 'yield'? Внутри функции doSomeWork я использую функции генератора для вставки данных в мою базу данных, поэтому, если я не использую 'yield', это не сработает, или мне придется переписать много кода. –

+1

Не совсем понимаю. Если вы положите 'yield' перед' doSomeWork', то Koa будет ждать его завершения. Насколько я понимаю ваш вопрос, вы этого не хотите. Если 'doSomeWork' является генератором, дающим обещания, которые вы хотите выполнить последовательно, затем вызовите его с помощью' co'. –