流星纤维的“同步”模式让我发疯。这是一个简单的代码示例:

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”两次...
您将如何用流星/光纤代码做到这一点?

最佳答案

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

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函数中的所有内容都在其自己的光纤中执行,就好像它是异步的一样,这就是为什么首先输出“ and there”的原因

关于javascript - meteor (光纤)循环和回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15632073/

10-10 00:02