2015-04-03 114 views
0

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

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(); 
        }); 
       } 
      } 
     } 
    }); 
+0

的可能重复的[JavaScript的闭合环内 - 简单实用示例](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Zirak 2015-04-03 23:39:03

回答

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])); 
     } 
    } 
}); 
+0

这应该是为了清晰起见,在“for”循环之外完成。 IIFE不是去这里的路。 – Sethen 2015-04-03 16:56:39

+0

在我看来,一个IIFE是去这里的方式,但任何功能都可以做 – adeneo 2015-04-03 16:57:31

+0

它不是可扩展的,只是使事情进一步复杂化。这是不正确的,并且无助于此代码的清晰度和可重用性。 – Sethen 2015-04-03 16:58:07

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]); 
    } 
});