首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Meteor (Fibers)循环和回调

Meteor (Fibers)循环和回调
EN

Stack Overflow用户
提问于 2013-03-26 16:00:25
回答 4查看 1.4K关注 0票数 1

流星纤维“同步”模式快把我逼疯了。下面是一个简单的代码示例:

代码语言:javascript
复制
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代码中实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-27 05:26:56

在“纤程”中的另一种方法(它可能比我上面发布的“未来”的答案更好):

代码语言:javascript
复制
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');

输出将为:

代码语言:javascript
复制
"and there"
"1234" "0"
"here" "0"
"6789" "1"
"here" "1"
"there"

请注意,纤程函数中的所有内容都是在它自己的纤程中执行的,就好像它是异步的一样,这就是为什么首先输出"and there“

票数 1
EN

Stack Overflow用户

发布于 2013-03-27 04:28:16

我不确定这与流星、光纤或“同步模式”有什么关系。我认为这只是你的javascript中的一个bug。您正在循环通过一个数组,然后在回调中调用一个对象的属性。当然,当回调最终被调用时,它将查看feed的当前值,该值将是循环退出后最近分配的值。

所以你应该重写你的代码来考虑到这一点:

代码语言:javascript
复制
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));
}
票数 0
EN

Stack Overflow用户

发布于 2013-03-27 05:14:13

好的,这里是“纤程”的方式:

代码语言:javascript
复制
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');

结果输出将是:

代码语言:javascript
复制
"and there"
"here" "0" "the out data from the 1st callback"
"here" "1" "the out data from the 2nd callback"
"there"

这正是你所期望的。Fibers中的"future“期望提供给函数的最后一个参数是一个回调,并将返回err作为第一个参数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15632073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档