2016-12-05 12 views
0

ユーザーのためにAPIを呼び出し、各ユーザーごとに複数のデータを取得し、すべてをローカルファイルに書き込むNodeJSスクリプトがあります。すべてのデータがファイルに書き込まれたら、そのファイルをサーバーにアップロードしようとしています。問題は、ファイルがアップロードされる前にコードが実行されてから、ファイルが完全に読み込まれることです。コードは以下のように書かれています。私は、最初の機能が完了するのを待つ約束をする方法を理解できません。NodeJSは完了を約束します

var fs = require('fs'); 
var server = require('some-server'); 
var service = require('./some-service.js'); 
var moment = require('moment-timezone'); 
var csvWriter = require('csv-write-stream'); 
var writer = csvWriter({ 
sendHeaders: false 
}); 

var users = require('./some-users') 
writer.pipe(fs.createWriteStream('myFile' + '.txt')) 

service.login().then(function (response) { 

users.forEach(function (user) { 

    service.getSpecificUser(user).then(function (response) { 

     var myUser = JSON.parse(response) 
     service.getDataForUser(user.Info).then(function (response) { 
      var userData = JSON.parse(response); 
      if (userData.IsValid) { 
       userData.AdditionalInfo.forEach(function (additionalInfo) { 
        service.getAdditionalInfo(myUser.Info, userData.data).then(function (response) { 

         //Collect additional info and combine final results to write into file 
         // write to output csv file 
         writer.write({ 
          //write information that is of interest 
         }) 

        }, function (error) { 
         console.log('error getting additional data', error); 
        }) 
       } 
       ) 
      } 
     }, function (error) { 
      console.log('error getting user data', error) 
     }) 
    }, function (error) { 
     console.log('error', myUser, error) 
    }) 
}); 
}, function (error) { 
console.log('not logged', response); 
}).then(function() { 
//perform uploading to server 
var fpath = 'path of file that contains downloaded data' 
console.log("Trying to upload to file: " +fpath) 
service.UploadFile(fpath, function (error, result, response) { 
    if (!error) { 
     console.log("Uploaded " + name); 
    } 
    else { 
     console.log(error); 
    } 

}) 
}) 

助けていただければ幸いです。

+0

最後に「javascript」のどの部分を呼び出す必要がありますか? 'writer.write()'はコールバックを持っているか、 'Promise'を返していますか? – guest271314

+0

@ guest271314最後の機能はファイルをサーバにアップロードする必要があり、最後に – alminh

+0

と呼ばれる必要があります。[約束で '.forEach'を使うことはできません](http://stackoverflow.com/q/37576685/1048572)。 – Bergi

答えて

1

Promise.all(),Array.prototytpe.map().forEach()に置き換えることができます。 csv-write-steamのドキュメントは、.end()を使用して、.write()、最後に.then()を呼び出しているようです。

service.login().then(function(response) { 
    return Promise.all(users.map(function(user) { 
     return service.getSpecificUser(user).then(function(response) { 
     var myUser = JSON.parse(response) 
     return service.getDataForUser(user.Info).then(function(response) { 
      var userData = JSON.parse(response); 
      if (userData.IsValid) { 
      return Promise.all(userData.AdditionalInfo.map(function(additionalInfo) { 
       return service.getAdditionalInfo(myUser.Info, userData.data).then(function(response) { 
       //Collect additional info and combine final results to write into file 
       // write to output csv file 
       writer.write({ 
        //write information that is of interest 
       }); 
       }) 
      })) 
      } 
     }) 
     }) 
    })); 
    }) 
    .then(function() { 
    writer.end(); 
    //perform uploading to server 
    var fpath = 'path of file that contains downloaded data' 
    console.log("Trying to upload to file: " + fpath) 
    service.UploadFile(fpath, function(error, result, response) { 
     if (!error) { 
     console.log("Uploaded " + name); 
     } else { 
     console.log(error); 
     } 

    }) 
    }) 
    .catch(function(e) { 
    console.log(e) 
    }) 
+0

そこに 'writer.end()'を呼び出さないでください。書き込みプロセスは同期的なので、何も待つ必要はありません。 'writer.end()'は約束を返しません。たとえそれがあったとしても、「約束解答」は必要ありません。 – Bergi

+0

エラーが発生したときにファイルをアップロードするのはなぜですか? '.catch'を最後まで動かすべきです。 – Bergi

+0

@Bergi 'csv-write-stream'を試したことがありません。スクリプト自体を読もうとしていた。 '.end()'は呼び出す必要はありませんか? '.catch()'を '.then()'にチェーンしました – guest271314

関連する問題