Javascript 承诺。最终不会作为链的最后一个调用返回

Javascript 承诺。最终不会作为链的最后一个调用返回,javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我有下面的承诺链,我期望的解析函数。最终是承诺返回,但不是最后一个。然后是返回的一个 exportReportToJson (url,opts) { const requestJSON = { "values" : [] }; return this.getValue(url) .then( value => { requestJSON.values.push(value); if(opts.extraValue){

我有下面的承诺链,我期望的解析函数。最终是承诺返回,但不是最后一个。然后是返回的一个

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)
}
正如你所看到的,我希望最终永远是被回报的最终承诺,这不是我的目的吗?我错过了什么?我以为这是个好办法,一直都是

不,请稍等

我想要一个有条件的。然后在不改变最后。然后基本上。

。最后不让你改变承诺的解决方式;它只是用来做拆卸逻辑。如果承诺以某种价值解决,则仍以该价值解决;如果它以某个值被拒绝,它仍以该值被拒绝

您可以在此处查看有关其行为的更多信息:

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

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

那么解决办法是什么呢?制造。最终返回一个。解决?@Mojimi你最终需要知道它已经完成了。若要处理值,需要使用then/catch。若每个处理程序都有一个处理程序,则只需将其移动到单独的函数:函数handlepromiser response{…},并将其用作promise。然后handlePromise,handlePromise。但是我建议您将错误处理和成功响应处理的逻辑分开。then=>requestJSON?@RolandStarke我想我不能,因为。then before没有在解析函数中返回承诺您只是缺少一个返回。finally=>return requestJSON;;还有几个;。请注意,这不是你的回报承诺,而是承诺的结果。您仍然需要处理这个可能重复的@Liam one-liner arrow函数自动返回,而无需键入return