最终没有返回作为链的最后一个电话

时间:2019-01-14 16:26:07

标签: javascript ecmascript-6 es6-promise

我有以下承诺链,我希望可以返回.finally()的resolve函数,但最后一个.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()

请不要等待。

我想有一个条件.then,而基本上不更改最终.then。

2 个答案:

答案 0 :(得分:1)

.finally不允许您更改承诺的内容;这只是为了进行拆卸逻辑。如果承诺以某种价值解决,那么它仍然以该价值解决;如果拒绝某个值,则该值仍被拒绝。

您可以在此处查看有关其行为的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

如果需要更改值,请使用.then或.catch。如果您还希望两者都具有相同的逻辑,则需要同时使用两者。这要么意味着复制代码,要么将其提取到命名函数中。

答案 1 :(得分:0)

没有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;
  });
}