流星纤维“同步”模式快把我逼疯了。下面是一个简单的代码示例:
var feedsData = feeds.fetch(); // [{_id: "1234"}, {_id: "6789", url: "http://...."}]
for(var i = 0, len = feedsData.length; i < len; i++) {
var feed = feedsData[i];
parser.parseURL(feed.url, function(err, out){
console.log(feed._id, i); // outputs "6789" and "2" each times
});
}我不知道该怎么做。回调是在循环结束后调用的,但是应该保留内部内部变量,如feed ...但事实并非如此。
解析的_id是好的(第一个,然后是第二个),但是我不能更新我的数据,因为我在回调中没有好的url。
需要的输出将是:"1234“"0”和"6789“"1",而不是"6789”"2“...如何在Meteor / Fiber代码中实现这一点?
发布于 2013-03-27 05:26:56
在“纤程”中的另一种方法(它可能比我上面发布的“未来”的答案更好):
var feedsData = feeds.fetch(); // [{_id: "1234"}, {_id: "6789", url: "http://...."}]
Fiber(function() {
var fiber = Fiber.current;
for(var i = 0, len = feedsData.length; i < len; i++) {
var feed = feedsData[i];
parser.parseURL(feed.url, function(err, out) {
console.log(feed._id, i);
if(err) return fiber.throwInto(err);
fiber.run();
});
Fiber.yield();
console.log('here', i);
}
console.log('there');
}).run();
console.log('and there');输出将为:
"and there"
"1234" "0"
"here" "0"
"6789" "1"
"here" "1"
"there"请注意,纤程函数中的所有内容都是在它自己的纤程中执行的,就好像它是异步的一样,这就是为什么首先输出"and there“
发布于 2013-03-27 04:28:16
我不确定这与流星、光纤或“同步模式”有什么关系。我认为这只是你的javascript中的一个bug。您正在循环通过一个数组,然后在回调中调用一个对象的属性。当然,当回调最终被调用时,它将查看feed的当前值,该值将是循环退出后最近分配的值。
所以你应该重写你的代码来考虑到这一点:
var feedsData = [{_id: "1234"}, {_id: "6789", url: "http://...."}]
for(var i = 0, len = feedsData.length; i < len; i++) {
var feed = feedsData[i];
parser.parseURL(feed.url, function(err, out){
console.log(this._id, arguments[0]); // will output "1234 0" and "6789 1"
}.bind(feed, i));
}发布于 2013-03-27 05:14:13
好的,这里是“纤程”的方式:
var Future = require('fibers/future'),
wait = Future.wait,
feedsData = feeds.fetch(); // [{_id: "1234"}, {_id: "6789", url: "http://...."}],
parseUrl = Future.wrap(parser.parseURL);
Fiber(function() {
for(var i = 0, len = feedsData.length; i < len; i++) {
var feed = feedsData[i];
var out = parseUrl(feed.url).wait();
console.log('here', i, out);
}
console.log('there');
}).run();
console.log('and there');结果输出将是:
"and there"
"here" "0" "the out data from the 1st callback"
"here" "1" "the out data from the 2nd callback"
"there"这正是你所期望的。Fibers中的"future“期望提供给函数的最后一个参数是一个回调,并将返回err作为第一个参数
https://stackoverflow.com/questions/15632073
复制相似问题