承诺链接拒绝

时间:2019-07-16 15:59:45

标签: javascript reactjs promise

我正在编码此链接的诺言。

首先,单击按钮时,它将检查文件url是否存在:

如果不是,它将拒绝,然后在警报中显示响应状态。

如果是,那么它将通过webapi更新数据库,然后更新react状态。

我面临的问题是,即使我在validateResponse函数中拒绝了它,它仍然会在下一个运行。

我认为应该直接去抓。

此外,下面的代码调用webapi似乎不好,在then里面的一个承诺,等等。整个代码似乎还不清楚?这样做是更好的方法吗?

onClick: (event, row) => {


function validateResponse(response) {
  if (!response.ok) { // assume it is the reject case.
    console.log("file not ready");
    return Promise.reject(response.statusText);
  } else {
    window.open(response.url, '_blank', 'location=yes,height=500,width=600,scrollbars=no,status=yes')
    return response;
  }

}


fetch(row.fileurl, {
  method: 'HEAD'
})
.then(validateResponse)

.then(console.log("== this line not printed, due to rejected."))

.then(row.linked = 1)

.then( 
    fetch(this.server_url+'/file/linked', { method: 'POST', body: JSON.stringify(row),  headers: { 'Content-Type': 'application/json' }, })
      .then(res => {
        console.log("== it should be rejected!, why printed this line2")
        if (res.status==200) {
          this.setState({ row });
        } else {
          row.checked = 0;
          throw Error(res.status);
        }

  })                            

)
.catch(function (error) {
    alert("Sorry, the file is not avaliable yet")
});


}

另一个问题:

.then(() => row.linked = 1)
.then(() => fetch(this.server_url+'/file/linked', { method: 'POST', body: JSON.stringify(row),  headers: { 'Content-Type': 'application/json' }, })

如何将其组合成一个?

.then(() => row.linked = 1 && fetch(this.server_url+'/file/linked', { method: 'POST', body: JSON.stringify(row),  headers: { 'Content-Type': 'application/json' }, })

这是更好/正确的方法吗?

2 个答案:

答案 0 :(得分:1)

返回Promise.reject应该可以使它工作。

问题是,当您未在.then中指定返回值时,默认情况下它将使用未定义的值来解决promise。

根据您的情况,您应该更改validateResponse,以便它返回被拒绝的承诺:

return Promise.reject(response.statusText);

检查this以获得更多信息。

=================

编辑:尝试使用此代码

onClick: (event, row) => {
  function validateResponse(response) {
    if (!response.ok) { // assume it is the reject case.
      console.log("file not ready");
      return Promise.reject(response.statusText);
    } else {
      window.open(response.url, '_blank', 'location=yes,height=500,width=600,scrollbars=no,status=yes')
      return response;
    }
  }

  fetch(row.fileurl, {
    method: 'HEAD'
  })
  .then(validateResponse)
  .then(() => console.log("== this line not printed, due to rejected."))
  .then(() => row.linked = 1)
  .then(() => fetch(this.server_url+'/file/linked', { method: 'POST', body: JSON.stringify(row),  headers: { 'Content-Type': 'application/json' }, })
    .then(res => {
      console.log("== it should be rejected!, why printed this line2")
      if (res.status==200) {
        this.setState({ row });
      } else {
        row.checked = 0;
        throw Error(res.status);
      }
    })
  )
  .catch(function (error) {
      alert("Sorry, the file is not avaliable yet")
  });
}

======================

Edit2:.then接受一个函数作为回调。这意味着您可以根据需要将其放在一个大函数中:

onClick: (event, row) => {
  function validateResponse(response) {
    if (!response.ok) { // assume it is the reject case.
      console.log("file not ready");
      return Promise.reject(response.statusText);
    } else {
      window.open(response.url, '_blank', 'location=yes,height=500,width=600,scrollbars=no,status=yes')
      return response;
    }
  }

  fetch(row.fileurl, {
    method: 'HEAD'
  })
  .then(validateResponse)
  .then(() => {
    console.log("== this line not printed, due to rejected.");
    row.linked = 1;
    return fetch(this.server_url+'/file/linked', { method: 'POST', body: JSON.stringify(row),  headers: { 'Content-Type': 'application/json' }, })
      .then(res => {
        console.log("== it should be rejected!, why printed this line2")
        if (res.status==200) {
          this.setState({ row });
        } else {
          row.checked = 0;
          throw Error(res.status);
        }
      })
  })
  .catch(function (error) {
      alert("Sorry, the file is not avaliable yet")
  });
}

答案 1 :(得分:1)

您没有在回调中调用第二次提取,这会导致提取立即启动

function someFunc() {
    // You are invoking the second fetch immediately
    fetch("example.com")
        .then(validate)
        .then(fetch("somewhere.com"))

    // You need to invoke it as a callback
    fetch("example.com")
        .then(validate)
        .then(() => fetch("somewhere.com"))

    // Or with non-arrow
    fetch("example.com")
        .then(validate)
        .then(function() {
            return fetch("somewhere.com");
        });
}