Доступ к значению разрешения обещания - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть обещание, которое разрешает переменную this.data в Read Excel Service, как показано ниже,

  parseExcel(excelFile): Promise<any>
  {
    /* wire up file reader */
    const target: DataTransfer = <DataTransfer>(excelFile.target);
    if (target.files.length !== 1) throw new Error('Cannot use multiple files');
    const reader: FileReader = new FileReader();
    return new Promise((resolve, reject) => {
        reader.onload = (e: any) => 
        {
          /* read workbook */
          const bstr: string = e.target.result;
          const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });

          /* grab first sheet */
          const wsname: string = wb.SheetNames[0];
          const ws: XLSX.WorkSheet = wb.Sheets[wsname];

          /* save data */
          this.data = <AOA>(XLSX.utils.sheet_to_json(ws, { header: 1 }));
          console.log("BOM PARSE SERVICE LOG: " , this.data)
          resolve(this.data);
        };
        reader.readAsBinaryString(target.files[0]);
    })
}

Я сейчас пытаюсь получить доступ к разрешенному массиву здесь

async ReadExcel(event)
  {
    return new Promise<Object>((resolve, reject) =>
    {
      var excelContents = this.parser.parseExcel(event).then(function(value)
      {
        return value
      }
      console.log("New Quote Component Log: ", excelContents)
      //need var excelContents to only contain the array and not contain the value of the promise object
    }
  )}
}

оператор log в последней функции возвращает меня к этому ...

log statement

Есть ли способ, которым я могу иметь только переменную excelContents принять значение массива, а не все значение обещания?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Проблема в функции ReadExcel заключается в том, что .then () всегда возвращает экземпляр Promise, а не фактическое значение разрешения. Таким образом, делая let blabla = promise.then(v => {return v}), blabla переменная будет обещанием, и для доступа к значению разрешения вам нужно будет сделать blabla.then(v => ...).

. Поэтому, когда вы console.log переменная excelContents, Вы видите объект с двумя свойствами: состояние, представляющее состояние обещания, и значение, которое является значением разрешения.

Я рекомендую, если вы используете асинхронную функцию c, как я вижу, что вы делаете , чтобы использовать async / await следующим образом:

async ReadExcel(event)
  {
    return new Promise<Object>(async(resolve, reject) =>
    {
      try {
          var excelContents = await this.parser.parseExcel(event)
          console.log("New Quote Component Log: ", excelContents)
          //need var excelContents to only contain the array and not contain the value of the promise object
          resolve(excelContents)
      } catch(e) {
         reject(e)
      }
    }
  )}
}

, поскольку await promiseReturningFunc() вернет значение разрешения.

Будьте осторожны с обработкой ошибок, всегда используйте try / catch.

Также обратите внимание, что я добавил asyn c в обработчик обещаний.

0 голосов
/ 14 февраля 2020

Что бы вы ни делали, вам понадобится что-то асинхронное, чтобы получить реальные, обещанные данные. Очевидно, нет надежды получить его синхронно.

Ваша попытка с еще одним обещанием new не помогает вам приблизиться (фактически, он использует конструктор обещания antipattern ). Просто сделайте:

async ReadExcel(event) {
    var excelContents = await this.parser.parseExcel(event);
    console.log("New Quote Component Log: ", excelContents);
}

Для ясности: не обманывайте себя, думая, что возврат excelContents в этой последней функции даст вам синхронный доступ к ней. Это не принесет вам никакой пользы, потому что вам понадобится await, который вернул значение снова, в еще одной функции async. Итак ... это оно. Сделайте все, что вам нужно сделать с excelContents, прямо здесь, в этой функции async, после await.

...