#node.js #koa
#node.js #koa
Вопрос:
У меня есть koa
приложение, в котором есть множество функций, разделенных на отдельные файлы. Когда вызывается один маршрут, мне нужно передать контекст this
другой функции (которая также является маршрутом) в отдельном файле.
a.js
Маршрут файла — http://127.0.0.1:3000/foo
exports.foo = function *() {
this.body = 'Some Value';
}
b.js
Маршрут файла — http://127.0.0.1:3000/bar
var a = require('a');
exports.bar = function *() {
this.body = yield a.foo(); // this obviously doesn't work.
}
Я хочу иметь возможность yield a.foo()
использовать текущий context ( this
) и заставить его работать так, как будто он вызывается обычным маршрутизатором.
Комментарии:
1. Я думаю, что ваша общая функциональность лучше разместить в промежуточном программном обеспечении, где оба
/foo
и/bar
маршруты могут вызыватьyield this.sharedFeature(opts)
. Если вы хотите пойти своим путем, тогда просто сделайтеyield a.foo.bind(this)
2. Хммм, @kilianc похоже
yield a.foo.bind(this)
, что выполнение на самом деле не вызывает функцию и не возвращается из функции? Есть ли что-то особенное, что вам нужно сделатьa.foo
?3. a.foo — это генератор, верно? тогда вам не нужно делать ничего конкретного, попробуйте
a.foo.call(this)
, но.bind
тоже должно сработать4. @kilianc вы были правы, это действительно работает. Если вы укажете это в качестве ответа, я соглашусь. Спасибо за вашу помощь.
Ответ №1:
Я думаю, что ваша общая функциональность лучше разместить в промежуточном программном обеспечении, где оба /foo
и /bar
маршруты могут вызывать yield this.sharedFeature(opts)
.
Если вы хотите пойти своим путем, тогда просто сделайте yield a.foo.call(this)
Комментарии:
1.
yield a.foo.call(this)
лучше. нет необходимости привязывать
Ответ №2:
Здесь есть несколько проблем. во-первых, вы должны вернуть значение (или передать значение обратно при обратном вызове). Также существует проблема с тем, как требуется файл .js. Вам нужно добавить к нему путь «./a» (или где бы вы его ни хранили), а не «a». Вот пересмотр (обратите внимание, что я не включаю koajs в код, поскольку это просто проблема javascript / nodejs):
// a.js
exports.foo = function() {
this.body = 'Some Value';
return this;
}
// b.js
var a = require('./a'); // assumes a.js is in same directory as b.js
exports.bar = function () {
var aThis =a.foo();
console.log(aThis.body);
};
// c.js
var b = require('./b');
b.bar(); // <<<<< prints "Some Value"
Вот как контекст bar() может быть передан foo():
// a.js
exports.foo = function(bScope) {
console.log("this is bValue of b scope: %s", bScope.bValue);
}
// b.js
var a = require('./a');
exports.bar = function () {
this.bValue = "value of b";
a.foo(this);
}
// c.js
var b = require('./b');
b.bar(); // <<<<<<<< prints "this is bValue of b scope: value of b"
Комментарии:
1. Не совсем то, что я ищу, в частности, мне нужен контекст из bar для передачи в foo. Что касается того, как
a
это требуется, это всего лишь пример.2. Хорошо, я пересмотрю ответ на этот вопрос