2017-04-11 40 views
0

我完全不熟悉NodeJS,这个问题一直困扰着我好几天了。我拉我的头发找到一个工作解决方案。我试图从数据库中获取信息并将其传递给一个文本文件,然后我从中读取它。我不能顺序地做。它总是先读取它然后创建它。我不知道我应该采取什么方式来解决这个问题。任何工作解决方案/方式都将有极大的帮助。NodeJS-如何顺序创建一个文件然后读取?

从数据库中检索信息,我的连接文件:调用接收数据的方法

this.getInfo = function() { 
return new Promise(function(resolve, reject){ 
    db.query('SELECT ai_code from user_code', 
    function(err,rows){ 
     if(err) 
     reject(err); 
     resolve(rows); 
    }); 
}); 
} 

module.exports = 
{ 
    getInfo: this.getInfo 
} 

功能。

function team1Code(){ 
    db.getInfo().then(function(result){ 
     var code = JSON.stringify(result[0]); 
     var c = json2plain(code, options); 
     c = c.replace('Ai_code:',''); 
     fs.writeFile('./scr1.js', c, { overwrite: true, encoding: 'ascii' },function (err) { 
     if (err) return console.log(err); 
     }); 
    }); 
} 
function team2Code(){ 
    db.getInfo().then(function(result){ 
     var code = JSON.stringify(result[1]); 
     var c = json2plain(code, options); 
     c = c.replace('Ai_code:',''); 
     fs.writeFile('./scr2.js', c, { overwrite: true, encoding: 'ascii' },function (err) { 
      if (err) return console.log(err); 
     }); 
    }); 
} 

最后,这是我们尝试读取文件的内容。

vmHandler.init = function(apiValues) { 
    team1Code(); 
    team2Code(); 
    // Team 1 
    try{ 
     vmHandler.team1.scriptCode = fs.readFileSync('./scr1.js'); 
     vmHandler.team1.script = new vm.Script(vmHandler.team1.scriptCode); 
     vmHandler.team1.sandbox = { api: new Api(apiValues, 1) } 
     vmHandler.team1.context = new vm.createContext(vmHandler.team1.sandbox); 
    }catch(err){} 
    // Team 2 
    try { 
     vmHandler.team2.scriptCode = fs.readFileSync('./scr2.js'); 
     vmHandler.team2.script = new vm.Script(vmHandler.team2.scriptCode); 
     vmHandler.team2.sandbox = { api: new Api(apiValues, 2) } 
     vmHandler.team2.context = new vm.createContext(vmHandler.team2.sandbox); 
    } catch(err) { 
     console.log("ERROR: " + err); 
    } 
}; 

回答

1

你正在服用的方法是稍微不利的,因为该函数调用 team1Code(); team2Code(); 不确保未来try-catch块被执行之前完成。这是因为两个调用都是异步的,因此下一行在完成之前会被执行,即使他们正在使用promise。 承诺本身是异步的,它们变得容易的是任何then中的所有代码都将不会被执行,直到承诺得到解决,但其余代码将像往常一样执行。所以,这里是用更新代码完成任务的方法。

function writeFile(fileName,data){ 
    return new Promise(function(resolve, reject){ 
     var code = JSON.stringify(data); 
     var c = json2plain(code, options); 
     c = c.replace('Ai_code:',''); 
     fs.writeFile(fileName, c, { overwrite: true, encoding: 'ascii' },function (err) { 
      if(err) 
       reject(err); 
      resolve(); 
     }); 
    }) 
} 
//Finally, this is where we try to read the content of the files. 

vmHandler.init = function(apiValues) { 
    var files = ['./scr1.js','./scr2.js']; 
    db.getInfo().then(function(result){ 
     var allPromise = []; 
     for(var key in files){ 
      allPromise.push(writeFile(files[key], result[key])); 
     } 
     return Promise.all(allPromise); 
    }).then(function(res){ 
     // Team 1 
     try{ 
      vmHandler.team1.scriptCode = fs.readFileSync('./scr1.js'); 
      vmHandler.team1.script = new vm.Script(vmHandler.team1.scriptCode); 
      vmHandler.team1.sandbox = { api: new Api(apiValues, 1) } 
      vmHandler.team1.context = new vm.createContext(vmHandler.team1.sandbox); 
     }catch(err){} 
     // Team 2 
     try { 
      vmHandler.team2.scriptCode = fs.readFileSync('./scr2.js'); 
      vmHandler.team2.script = new vm.Script(vmHandler.team2.scriptCode); 
      vmHandler.team2.sandbox = { api: new Api(apiValues, 2) } 
      vmHandler.team2.context = new vm.createContext(vmHandler.team2.sandbox); 
     } catch(err) { 
      console.log("ERROR: " + err); 
     } 
    }); 
}; 
+0

非常感谢@nurulnabi表现出勇气,并花时间重新编码。它现在几乎可以工作,但是在'init'之后接收代码的另一部分代码存在一个小问题。即使在发生此问题之前,我似乎也无法绕过它。程序的这一部分并行运行,不管怎样,从'init'返回的代码部分都没有。它最终没有定义。 'api'是未定义的,就好像它从未从文件接收任何东西。代码位于以下链接中,您可以看到该部分。 https://hastebin.com/afenaqojut.js –

+0

您能否提供完整的代码文件@VG – nurulnabi

+0

确实。 https://hastebin.com/qafihumeji。js –

0

在wmHandler.init功能,你开始2个异步操作(查询和存储),并从上述异步操作应写入文件中读取。

但是,文件读取是在之后立即执行的,2个异步操作开始。因此,预计在写入之前读取这些文件。

要解决这个问题,请让team1Code和team2Code返回自己的Promises,并且在写入之前不要读取这些文件。

team1Code(). 
    .then(team2Code) 
    .then(readFiles) 

哪里readFiles是确实的文件读取功能,并team1Code,team2Code返回时承诺写入文件的这一决心。

This answer解释了Javascript中的异步回调。

+0

感谢您的回复安德烈。任何承诺/回调我都无法成功。我在readFileSync中创建了一个回调函数(我稍后将其重命名为readFile以进行回调操作)。但它在最后返回空字符串。我只是不知道该怎么做。我一直在互联网上爬行,但没有运气到目前为止。 –

相关问题