2017-07-30 65 views
0

我运行这段代码,应保存网页与目前现场版本进行比较,但它似乎只为最后一个条目这样做:For循环似乎跳过一些代码

ipcMain.on('compare', (event, arg) => { 
    index.find({ 
    "type": "website" 
    }, function(err, docs) { 
    var doc; 
    var data; 
    for (i = 0; i < docs.length; i++) { 
     console.log(doc = docs[i]); 
     console.log(i); 
     request('GET', doc.URL).done(function(res) { 
     data = fs.readFileSync(DataPath + "/savedpages/" + doc.Name + ".html"); 
     console.log(data); 
     console.log(res.getBody()) 
     if (data == res.getBody()) { 
      index.update({ 
      _id: doc.ID 
      }, { 
      $set: { 
       Changes: false 
      } 
      }, function(err, updateval) { 
      if (err) throw err; 
      console.log(doc.Name); 
      event.sender.send('update-false', doc.Name + "-changescell") 
      }) 
     } else { 
      index.update({ 
      _id: doc.ID 
      }, { 
      $set: { 
       Changes: true 
      } 
      }, function(err, updateval) { 
      if (err) throw err; 
      console.log(doc.Name); 
      event.sender.send('update-true', doc.Name + "-changescell") 
      }) 
     } 
     }) 
    } 
    }) 
}) 

输出如下这个:

{ Changes: false, 
type: 'website', 
Date: 2017-07-30T14:04:35.592Z, 
Name: 'petra', 
URL: 'http://petra.oldisoft.de', 
_id: 'SXtHgqAWniDBAibJ' } 
0 
{ Changes: false, 
type: 'website', 
Date: 2017-07-30T14:03:26.658Z, 
Name: 'heise', 
URL: 'http://heise.de', 
_id: 'zOc1Wnm801huVPjs' } 
1 
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... > 
<Buffer 3c 2f 68 65 61 64 3e 0a 3c 62 6f 64 79 20 6f 6e 6c 6f 61 64 3d 27 6a 
61 76 61 73 63 72 69 70 74 3a 64 6f 63 75 6d 65 6e 74 2e 61 6e 6d 65 6c 64 
75 6e ... > 
heise 
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... > 
<Buffer 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 
61 6e 67 3d 22 64 65 22 3e 0a 0a 3c 68 65 61 64 3e 0a 20 20 20 20 3c 74 69 
74 6c ... > 
heise 

在我看来,代码在for循环运行时跳过一部分代码。我不明白为什么它表现如此。

+0

内一切'done'是异步代码,因此它不会的其余部分同步运行码。尽管如此,你应该尝试将其降低到[MCVE]。这是很多有意义的代码来挖掘。 – Carcigenicate

回答

0

这是因为您正在循环中运行异步代码。

为了克服这一点,你需要通过一个功能包装的异步代码来创建一个封闭:

for(i = 0; i < docs.length; i++){ 
    console.log(doc = docs[i]); 
    console.log(i); 
    runAsyncCode(doc) 
    } 

function runAsyncCode(doc){ 
    request('GET', doc.URL).done(function(res) { 
      data = fs.readFileSync(DataPath + "/savedpages/" + doc.Name + ".html"); 
      console.log(data); 
      console.log(res.getBody()) 
      if(data == res.getBody()){ 
      index.update({_id: doc.ID}, {$set: {Changes:false}}, function(err, updateval){ 
       if(err) throw err; 
       console.log(doc.Name); 
       event.sender.send('update-false', doc.Name + "-changescell") 
      }) 
      } else { 
      index.update({_id: doc.ID}, {$set: {Changes:true}}, function(err, updateval){ 
       if(err) throw err; 
       console.log(doc.Name); 
       event.sender.send('update-true', doc.Name + "-changescell") 
      }) 
      } 
     }) 
}