Saya mengalami masalah dengan panggilan fetch() saya yang tidak berfungsi dengan benar. Saya memiliki metode rekursi yang memanggil dirinya sendiri dalam fungsi ini, tetapi setelah melewati pernyataan if, data itu sendiri tidak diselesaikan ke panggilan .then() di bawah ini. Saya ingin menyimpan metode rekursi dalam fungsi ini. Karena sistem yang dipanggil oleh fungsi ini akan mengubah data.result ke hasil yang berbeda yang bukan null. Saya hanya tidak tahu kapan itu akan terjadi, oleh karena itu saya menggunakan metode rekursi.

var someToken = "actually token";

function getResult(getToken) {
  return new Promise((resolve, reject) => {
    fetch(url, {
      headers: {
        "Authorization": something,
        "Jenkins-Crumb": getToken
      },
      redirect: 'follow',

    }).then(response => {
      return response.json()

    }).then(data => {

      if (data.result == null) {
        console.log('retrieving data')
        getResult(getToken)
      } else if (data.result == "SUCCESS") {
        console.log('success')
        resolve(data)
      }

    }).catch(err => {
      reject(err)
    })
  })
}

getResult(someToken).then(data => {
  console.log(data)
}).catch(err => console.log(err))
0
dacD 1 Februari 2020, 01:38

2 jawaban

Jawaban Terbaik

Coba gunakan async...await dan kode Anda akan jauh lebih sederhana

var someToken = "actually token";

async function getResult(getToken) {
  const resp = await fetch(url, {
    headers: {
      "Authorization": something,
      "Jenkins-Crumb": getToken
    },
    redirect: 'follow',
  });
  const data = await resp.json();
  if (data.result == null) {
    console.log('retrieving data')
    return getResult(getToken)
  } else if (data.result == "SUCCESS") {
    console.log('success')
    return data;
  }
}

getResult(someToken).then(data => {
  console.log(data)
}).catch(err => console.log(err))
1
Zohaib Ijaz 31 Januari 2020, 22:50

Anda perlu mengembalikan panggilan rekursif getResult dan menghindari antipattern konstruksi Janji eksplisit ( hanya return Janji saja):

function getResult(getToken) {
  return fetch(url, {
    headers: {
      "Authorization": something,
      "Jenkins-Crumb": getToken
    },
    redirect: 'follow',
  })
    .then(response => response.json())
    .then(data => {
      if (data.result == null) {
        console.log('retrieving data');
        return getResult(getToken); // <-----------------------------
      } else if (data.result == "SUCCESS") {
        console.log('success');
        return data; // <-------------------------------------------
      }
      // What if data.result is neither null nor SUCCESS?  <--------
    });
}

getResult(someToken).then(data => {
  console.log(data);
}).catch(err => console.log(err))

Demo langsung:

const getUrl = () => Math.random() < 0.25 ? 'data:,{"result":"SUCCESS"}' : 'data:,{}';

function getResult(getToken) {
  return fetch(getUrl(), {
    headers: {
      "Authorization": 'something',
      "Jenkins-Crumb": getToken
    },
    redirect: 'follow',
  })
    .then(response => response.json())
    .then(data => {
      if (data.result == null) {
        console.log('retrieving data');
        return getResult(getToken); // <-----------------------------
      } else if (data.result == "SUCCESS") {
        console.log('success');
        return data; // <-------------------------------------------
      }
      // What if data.result is neither null nor SUCCESS?  <--------
    });
}

getResult('someToken').then(data => {
  console.log(data);
}).catch(err => console.log(err))

Anda juga harus mempertimbangkan - if dan else if Anda di akhir .then mungkin tidak mencakup semua kemungkinan. Bagaimana jika data.result bukan null atau 'SUCCESS'? Berdasarkan logika Anda saat ini, panggilan getResult akan menghasilkan data menjadi undefined di konsumen. Jika ada kemungkinan itu terjadi, Anda mungkin ingin membuat kesalahan atau sesuatu dalam kasus itu.

if (data.result == null) {
  console.log('retrieving data')
  return getResult(getToken) // <-----------------------
} else if (data.result == "SUCCESS") {
  console.log('success')
  return data; // <-----------------------
}
throw new Error('data.result is neither null nor 'SUCCESS'');
3
CertainPerformance 2 Februari 2020, 05:23