машинопись и FireBase асинхронно ждут, чтобы сделать несколько звонков - PullRequest
0 голосов
/ 01 декабря 2018

Я читаю несколько записей пользователя из строки файла для строки.и каждая строка - это запись пользователя, которую я создаю, если она не существует.Одна и та же запись пользователя может быть в несколько строк.в общем, если я вижу, что он уже создан, я просто пропускаю.

код выглядит следующим образом

async onFilesAdded(files: FileList){
    this.fileToUpload = files.item(0);

    let fileReader = new FileReader();
    fileReader.onload = async (e) => {
     this.showProgress = true
      var lines = fileReader.result.toString().split(/[\r\n]+/g); // tolerate both Windows and Unix linebreaks
      this.totalLines = lines.length
      var firstLine = false

      this.dcSvc.getPageImages().then(
        (resp) => {
          console.log("resp in getPageImage" + JSON.stringify(resp))
          this.pageMap = resp
          this.lineCount = 0
          for(let line of lines){
            if(firstLine == false){
              firstLine = true
            }else{
               this.createClickHistory(line).then(
                 (resp)=> console.log("line processed")
               )
            }
          }
        }
      )
    }

    fileReader.readAsText(this.fileToUpload);
  }


 async createClickHistory(line:string){
        var lineArr = line.split(',')
        const userName = lineArr[1]

           this.dcSvc.getUser(userName).then(
             (res:any) => {
                         console.log("Response of get user is:::" + JSON.stringify(res))
                         if(res.length == 0 ){
                           //user does not exist in the DB
                           console.log("user:" + userName + " does not exist so creating it")
                           const userPayload = {
                                                 "userName": userName
                                               }

                                               this.dcSvc.createUser(userName, userPayload).then((rsp) => {})

                         }else{
                           //user exists so skip
    }
    }

     createUser(userName:string, userPayload){
        return this.db.object("/users/" + userName).set(userPayload)
      }

      getUser(userName:string){
        return new Promise((resolve, reject) => {
                  this.db.list('/users', 
                      ref => ref.orderByChild("userName").equalTo(userName)
                  ).snapshotChanges().subscribe(
                    (res) =>  {
                                resolve(res)
                              }
                  )
                })

      }

Я наблюдаю, что код действительно не ждет обработки одной строки.В результате я должен выполнить код несколько раз, чтобы импортировать полные данные.

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете использовать тайм-аут для задержки чтения вашей строки:

 var t = 0
 for (let line of lines){
   if (firstLine == false){
     firstLine = true
   } else{
     setTimeout(function(line){ this.createClickHistory(line).then(
       (resp)=> console.log("line processed")
     )}.bind(this, line), t*16) // 60fps
   }
   t++
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...