2017-10-02 18 views
0

でループの内側に他のコールバック/約束を/使用して同期呼び出しを作りますいくつかのテキストをファイルに追加します。は、私は次のような状況をしたのJavascript

function processAttrs(clazz) { 
     //window.alert("Hello" + clazz.name + " " + clazz.length); 
     var file = FileSystem.getFileForPath("/Users/XXX/" + clazz.name + ".txt"); 
     createFile(file, function() { 
      for (var i=0; i<clazz.attributes.length; i++) { 
       var attr = clazz.attributes[i]; 
       var text = "private " + attr.type + " " + attr.name + "\n"; 
       appendToFile(text, file); 
      } 
     }); 
    } 

問題がFileUtils.readAsText(ファイル)が非同期的に呼び出されることで、そのファイルに書き込む必要があるいくつかの行が迷子に:この関数から呼び出されます。

freeze()とunfreeze()は、コード実行を停止して再開するために何かを実装することを考えた空の関数ですが、このメカニズムはJavascriptでは存在しないようです。

私はcreateFile(file)関数で行ったようにコールバックを使うことを考えました。問題は、コード実行がforループの内側にあるため、コールバック関数として渡すべきものがわからないことです。

私は、forループのないソリューションを考えて、コールバックを使って手動でフローを処理することができますが、私はそれを気に入らないのです。より洗練されたソリューションが必要です。

答えて

0
あなたのコードを変更し、このように、 async/await構文を使用

示すようにあなたはあなたができる「ブロック」あなたのループ

function appendToFile(text, file) { 
    return new Promise((resolve, reject) => { 
     (function (e) { 
      //... 
     })(text); 
    }); 
} 

async function processAttrs(clazz) { 
    //window.alert("Hello" + clazz.name + " " + clazz.length); 
    var file = FileSystem.getFileForPath("/Users/XXX/" + clazz.name + ".txt"); 
    createFile(file, async function() { 
     for (var i=0; i<clazz.attributes.length; i++) { 
      var attr = clazz.attributes[i]; 
      var text = "private " + attr.type + " " + attr.name + "\n"; 
      const result = await appendToFile(text, file); 
     } 
    }); 
} 

または約束の滝のいくつかの種類async/await を使用することができます。

async function appendToFile(text, file) { 
    try { 
     freeze(); 
     var data = await FileUtils.readAsText(file) 
     console.log("File data: " + data); 
     console.log("File text: " + text); 
     var text = data + text; 
     await FileUtils.writeText(file, text, true) 
     console.log("File saved. Text: " + text); 
     unfreeze(); 
     return; 
    } catch (e) { 
     console.log('Error', e) 
    } 
} 

function processAttrs(clazz) { 
    var file = FileSystem.getFileForPath("/Users/XXX/" + clazz.name + ".txt"); 
    createFile(file, async function() { 
     for (var attr of clazz.attributes) { 
      var text = "private " + attr.type + " " + attr.name + "\n"; 
      await appendToFile(text, file) //This will stop the loop until each file is completed 
     } 
    }) 
} 
関連する問題