流星纤维“同步”模式让我发疯。这是一个简单的代码示例:
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)......但它们不是。
解析的url是好的(第一个,然后是第二个),但是后来我无法更新我的数据,因为我在回调中没有好的_id。
想要的输出是:“1234”“0”和“6789”“1”,而不是“6789”“2”两次...... 你会如何在流星/光纤代码中做到这一点?
答案 0 :(得分:1)
在“光纤”中做到这一点的另一种方式(它可能比我在上面发布的“未来”答案更好):
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"
请注意,Fiber函数中的所有内容都在自己的光纤中执行,就好像它是asynchrone一样,这就是为什么“and there”首先被输出
答案 1 :(得分:0)
不确定这与Meteor,Fibers或“同步模式”有什么关系。我认为这只是你的javascript中的一个错误。您循环遍历数组,然后在回调中调用对象的属性。当然,当最终调用回调时,它将查看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));
}
答案 2 :(得分:0)
好的,这是“光纤”的方式:
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中的“未来”期望给函数的最后一个参数是回调,并将返回err作为第一个参数
答案 3 :(得分:0)
最简单的解决方案是:
feeds.fetch().forEach(function(feed,i) {
parser.parseURL(feed.url, function(err, out){
console.log(feed._id, i);
});
});
Javascript没有块范围(但是,let
即将出现在ES6中),只有函数范围。