2014-10-31 25 views
1

我使用diffbot API沿着環路For循環沒有正確的NodeJS在工作

這是我的代碼

for (var i = 0; i< 200; i++){ 
    /* pass url from diffbot */ 
    console.log("Ready to send Url for parsing to Diffbot "); 

    diffbot.article({ uri: url }, function(err, response) { 
     if (!err) { 
      console.log(i); 
     } else { 
      console.log("Error Occur in url " + i + "and error is " + err); 
      /* need to Add logic for parsing */ 
     } 
    }); 
} 

現在,我得到控制檯消息像

output is coming 

200 
200 
200 
200 
200 

2百倍。

產量預計爲0〜199

有沒有任何身體告訴我,我錯了

感謝

+1

你需要一個clousure – 2014-10-31 09:02:24

+0

爲什麼我們需要clousure ..請你解釋一下 – kamalpreet 2014-10-31 09:03:26

+0

當語句'console.log(i);'執行時,'i'的值是200,因爲異步回調。你需要一個關閉來在時間語句'diff'中保留'i'的期望值'diffbot.article(...)'執行 – 2014-10-31 09:08:26

回答

2
for (var i = 0; i < 200; ++ i) { 
    diffbot.article ({ uri: url }, (function (i) { 
     return function (err, response) { ... } 
    })(i)); 
} 

這將工作。

+0

爲什麼添加函數(i){here。你可以解釋一下 – kamalpreet 2014-10-31 09:03:46

+0

的正確答案。 +1 – 2014-10-31 09:08:15

+0

@Kamalpreet請參閱http://stackoverflow.com/a/750506/2129835。簡短的回答:關閉。 – thgaskell 2014-10-31 09:26:25

3

會發生什麼事是簡單的:

你的循環,使200個職位。響應會針對每個帖子異步執行,這意味着所有帖子都可以在第一個響應到達時執行回調函數。因此,i==200屆時。

闡述您的評論後位:

你需要一個封閉的,你得到的響應時間保持i當前值,如fzzle的回答說:

diffbot.article({ uri: url }, (function(i) { 
     return function(err, response) { 
     ... } 
    })(i)); 

圈地您在function(i){ ... }中的回調函數創建閉包。這樣,我的當前值被傳遞給函數,然後可用於響應您想要的值,只要此響應會返回。

+0

檢查代碼..你不明白問題 – kamalpreet 2014-10-31 09:04:11

+2

@Kamalpreet,他明白你的意思問題..你沒有。 – fzzle 2014-10-31 09:04:44

+0

我做到了,google用於異步和關閉。 @ fzzle的答案是你需要做的修復你的代碼。 – 2014-10-31 09:06:05