我在函數中定義了一個數組變量,裡面存有6個元素,然後在該函數中調用回調函數,在回調函數中無法訪問數組變量的值,但是可以訪問length屬性。感覺很迷惑,不知道該怎麼解決。
for(var i=0;i<bookARR.length;i++){//在该书中写入 有借图书馆id
//因为图书馆表需要所有书籍的_id,所以检测有时,记录id
console.log("在外面"+bookARR[i]);//9787539989891 9787533946777 9787569914078 9787513316286 9787218113180 9787535491978
Book.getBookByISBN(bookARR[i],function(err,book){
if(!book||err){
console.log("huidiao"+bookARR.length);//6
console.log("在里面"+bookARR[i]);//undefined undefined undefined undefined undefined undefined
newBook.push(bookARR[i]);
}else{
newBook_id.push(book._id);
}
ep.emit('examine');
})
}
Book.getBookByISBN()是我在其他模組定義的函數
伊谢尔伦2017-05-16 13:37:48
for (var i = 0; i<10; i++) {
setTimeout(function(){console.log(i)});
}
for (var i = 0; i<10; i++) {
(function(i){
setTimeout(function(){console.log(i)});
})(i)
}
for(var i=0;i<bookARR.length;i++){
(function(i) {
Book.getBookByISBN(bookARR[i],function(err,book){
if(!book||err){
console.log("huidiao"+bookARR.length)
console.log("在里面"+bookARR[i]);
newBook.push(bookARR[i]);
}else{
newBook_id.push(book._id);
}
ep.emit('examine');
})
})(i);
}
ringa_lee2017-05-16 13:37:48
前面已經說了原因了,其實就是在你定義Book.getBookByISBN()這個函數裡面的回調調用的地方傳入bookArr[i]就好了,理解一下形參和實參
漂亮男人2017-05-16 13:37:48
這是典型的非同步問題,i的作用域還在其中。
因為非同步等你 getBookByISBN
方法调用callback的时候 i=bookARR.length
。这已经越界了,所以是undefined
.
解決方:
1.閉包
2.let