Как назначить результаты функции http в array.map () в JavaScript - PullRequest
0 голосов
/ 07 октября 2019

Я прочитал МНОЖЕСТВО статей, но я совершенно новичок во всей этой асинхронной работе, и мне очень трудно обдумать, как все это работает. Я хочу отобразить отфильтрованный массив объектов, и внутри него я бы хотел вернуть результат функции (количество) и установить его в качестве значения pmtdue. Я пробовал это несколькими способами, но всегда получаю обещание зоны или наблюдаемое, когда оно регистрируется, или кучу ошибок. Это, вероятно, самое близкое, что я получил, но это все еще не правильно.

async today(day = null, status = null) {
    this.logger.log(`show today's ${status} appts ${day}`);
    // filter master list for today
    const filtered = [...this.apptList].filter(appt => {
      if (!status) {
        return (
          appt.scheduled >= this.helperService.dayStart(day) &&
          appt.scheduled <= this.helperService.dayEnd(day) &&
          appt.status.status !== 'Checked Out' &&
          appt.status.status !== 'Scheduled'
        );
      } else {
        return (
          appt.scheduled >= this.helperService.dayStart(day) &&
          appt.scheduled <= this.helperService.dayEnd(day) &&
          appt.status.status === status
        );
      }
    });
    // calculate due amount and map it to pmtdue field
    const dueappts = await this.getTotalDue(filtered).then(
      res => {
        // console.log(res);
        this.ApptModels = res;
      },
      err => {
        console.log(err);
      }
    );
    // send the data to ng2-smart-table
    console.log(`filtered ApptModels`, this.ApptModels);
}

Это функция, которая выполняет сопоставление и имеет функции, которые я хочу работать // a.pmtduedate возвращает правильное значениетак как нет http-вызова // a.pmtdue возвращает zoneawarepromise, но я не знаю, как получить ЗНАЧЕНИЕ

 getTotalDue(appts: Array<any>): Promise<any> {
    return Promise.all(
      appts.map(async (a: any) => {
        a.pmtduedate = await this.helperService.getDueDate(a);
        a.pmtdue = await this.dataService.sendTotalDue(a);
        console.log(a.pmtdue); // logs undefined
        return a;
      })
    );
  }

Моя функция обслуживания данных (я знаю, что иногда код имеет значение, которое я считаю незначительным):

 async sendTotalDue(appt) {
this.logger.log(`fetch amount ${appt.patientID.nickname} owes`);
return await this.http.post(`${SERVER_URL}/sendtotaldue`, appt);
}

И, наконец, бэкэнд-функция (без данных). На бэкэнде отображается правильное количество, я просто не могу отобразить его на веб-интерфейсе:

module.exports.sendTotalDue = (req, res) => {
  const appt = req.body;
  // callback function that handles returning data
  function done(err, results) {
    const totaldue = parseInt(results, 10);
    console.log(`API sendTotalDue CALLBACK done...totaldue: ${totaldue}`);
    if (err) {
      console.log('ERROR getting total due: callback error', err);
      res.sendStatus(500).json(err); // server error; it'd be good to be more specific if possible
    } else {
      // end the request, send totaldue to frontend
      console.log(`SUCCESS send totaldue to frontend ${totaldue}`);
      res.status(200).json(totaldue);
    }
  }
  // run first function
  console.log(`1.  getAmtDue:`);
  this.getAmtDue(appt, done);
};

module.exports.getAmtDue(appt, callback) {
... function finds past visits, past payment and due totals
}
module.exports.getCurrentDue(appt, pastdueamt, callback) {
... function finds current visits and payments.  calculates current due and adds the past due
callback(null, totaldue);
}

Может кто-нибудь помочь мне понять, что я делаю неправильно? Не стесняйтесь обдумать это, потому что именно так я себя чувствую в этот момент.

ИЗМЕНЕНО ДЛЯ ИСПРАВЛЕНИЙ ОШИБКИ, например, пропущенные ожидание и возвращение. Теперь я могу видеть значение, возвращаемое в сервисе данных, но я не определен в разделе функции карты. This image shows what is returned from the map function (Observable)

1 Ответ

0 голосов
/ 08 октября 2019

Оооо !!! Я ПОНЯЛ! Я до сих пор не до конца понимаю, ПОЧЕМУ это работает, но я изменил службу данных следующим образом:

async sendTotalDue(appt): Promise<any> {
    this.logger.log(`fetch amount ${appt.patientID.nickname} owes`);
    try {
      const result = await this.http
        .post(`${SERVER_URL}/sendtotaldue`, appt)
        .toPromise();
      return result as any[];
    } catch (error) {
     console.log(error);
    }
  }

При изменении службы на вышеприведенную, наконец, мои значения появились именно там, где я хотел их видеть в таблице данных. ! :)

Я нашел эту статью, которая помогла понять, как работать с Observable Angular Tutorial с Async и Await

...