JavaScript:在回调内访问变量

时间:2015-04-03 16:50:45

标签: javascript node.js

我正在尝试使用NodeJS中的开放图形插件来获取藤蔓的预览图像。 OG结果是正确的,但我无法从og回调中访问result [i] - 变量未定义。如何在OG回调中访问result [i]?

    Thing.find(function(err, result) {
        for (var i = 0; i < result.length; i++) {
            if (result[i].attachment) {
                if (result[i].attachment.embed_type == 'vine') {
                    og(result[i].attachment.embed_url, function(err, meta) {
                        result[i].attachment.preview_image = meta.image;
                        result[i].save();
                    });
                }
            }
        }
    });

2 个答案:

答案 0 :(得分:1)

您需要一个闭包,i不断更改,因为og是异步

Thing.find(function(err, result) {
    for (var i = 0; i < result.length; i++) {
        if ( result[i].attachment &&
             result[i].attachment.embed_type == 'vine') 
        {
            (function(res) {
                og(res.attachment.embed_url, function(err, meta) {
                    res.attachment.preview_image = meta.image;
                    res.save();
                });
            }(result[i]));
        }
    }
});

答案 1 :(得分:0)

JS does not have block scope

有一些方法可以解决此问题,例如创建函数。

而且,为了使其更清晰,更容易测试,我还将所有result[n]逻辑放在另一个函数中。

var process = function(resultItem) {
   if (resultItem.attachment && if (resultItem.attachment.embed_type == 'vine')) {
     og(resultItem.attachment.embed_url, function(err, meta) {
       resultItem.attachment.preview_image = meta.image;
       resultItem.save();
     });
   }
};

Thing.find(function(err, result) {
  for (var i = 0; i < result.length; i++) {
     process(result[i]);
  }
});