Обещание. Наконец, не возвращается в качестве последнего вызова цепи - PullRequest
0 голосов
/ 14 января 2019

У меня есть следующая цепочка обещаний, которая, как я ожидал, будет возвращена функцией разрешения функции .finally (), но вместо этого возвращается последний .then ().

exportReportToJson (url,opts) {
    const requestJSON = {
      "values" : []
    };

    return this.getValue(url)
    .then( value => {
      requestJSON.values.push(value);
      if(opts.extraValue){
        return this.getExtraValue(value);
      }else{
        return Promise.finally();
      }
    })
    //The index of .push gets returned instead
    .then(extraValue => requestJSON.values.push(extraValue))
    //But I want requestJSON to always be the returned Promise
    .finally( () => requestJSON)
}

Как видите, я хочу, чтобы в конечном итоге всегда было последнее обещание, которое нужно вернуть, разве это не то, для чего? Что мне здесь не хватает? Я думал, что это работает как .always ()

Не ждите, пожалуйста.

Я хочу иметь условные. Потом, не меняя финал. Потом в основном.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Нет функции Promise.finally. Похоже, что вы на самом деле хотели это

function exportReportToJson (url,opts) {
  return this.getValue(url).then(value => {
    if (opts.extraValue) {
      return this.getExtraValue(value).then(extraValue => [value, extraValue]);
    } else{
      return [value];
    }
  }).then(values => {
    const requestJSON = {values};
    return requestJSON;
  });
}
0 голосов
/ 14 января 2019

.finally не позволяет вам изменить то, что разрешает обещание; он просто предназначен для логики демонтажа. Если обещание разрешено с некоторым значением, оно остается разрешенным с этим значением; если он отклонен с некоторым значением, он остается отклоненным с этим значением.

Подробнее о его поведении можно узнать здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

Если вам нужно изменить значение, используйте .then или .catch. Если вам также нужна одинаковая логика в обоих случаях, вам нужно использовать оба. Это либо означает дублирование кода, либо извлечение его в именованную функцию.

...