【问题标题】:React Redux promise error - (...).then is not a functionReact Redux 承诺错误 - (...).then 不是函数
【发布时间】:2017-05-04 06:21:36
【问题描述】:

在提供的问题中查看了这一点,但 this 是最接近的,它并没有真正解决我的问题。

我有一个代码块(在页面下方稍稍详细说明)作为更大的提取块的一部分。它到达这个代码块并且如果这个代码块被注释掉也可以正常运行,即它执行成功的提取等并返回一个 JWT 没问题,但是......添加这个块,我得到以下错误:

TypeError: (0 , _localStorageDropDowns.confirmSelectDataExistance)(...).then 不是函数

它是指另一个文件夹中的这个函数(正确导入)..

export const confirmSelectDataExistance = () => {
  const companyStateShortNameJson = localStorage.getItem(COMPANYSTATESHORTNAME)
  const statesJson = localStorage.getItem(STATES)
  const suburbLocationsJson = localStorage.getItem(LOCATIONS)
  if (companyStateShortNameJson || statesJson || suburbLocationsJson) {
    console.log('something exists in localstorage')
    return true
  }
    console.log('nothing in localstorage')
  return false
}

简单函数 - 返回真或假。

这是代码块 - 它在第一行失败:

    return confirmSelectDataExistance().then(isConfirmed => {
      if (!isConfirmed) {
        dispatch({ type: REQUEST_SELECT_DATA })
        console.log('gets here!', isConfirmed)
        const token = getJwt()
        const headers = new Headers({
          'Authorization': `Bearer ${token}`
        })
        const retrieveSelectData = fetch('/api/SelectData/SelectData', {
          method: 'GET',
          headers: {
            'Content-Type': 'application/json;charset=UTF-8'
          },
        })
          .then(handleErrors)
          .then(response => response.json())
          .then(selectData => {
            dispatch({ type: RECEIVE_SELECT_DATA, payload: selectData })
            saveSelectData(selectData)
          });

        return saveSelectData(selectData);
      }
    })

根据我有限的经验,“confirmSelectDataExistance”是一个函数,为什么它说它不是?

最后,这里是整个动作的整体,所以你可以看到它是如何调用该块的。正如我所说的 - 将块注释掉,它可以完美运行。..

export const requestLoginToken = (username, password) =>
  (dispatch, getState) => {
    dispatch({ type: REQUEST_LOGIN_TOKEN, payload: username })

    const payload = {
      userName: username,
      password: password,
    }

    const task = fetch('/api/jwt', {
      method: 'POST',
      body: JSON.stringify(payload),
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      },
    })
      .then(handleErrors)
      .then(response => response.json())
      .then(data => {
        dispatch({ type: RECEIVE_LOGIN_TOKEN, payload: data })
        saveJwt(data)

        return confirmSelectDataExistance().then(isConfirmed => {
          if (!isConfirmed) {
            dispatch({ type: REQUEST_SELECT_DATA })
            console.log('gets here!', isConfirmed)
            const token = getJwt()
            const headers = new Headers({
              'Authorization': `Bearer ${token}`
            })
            const retrieveSelectData = fetch('/api/SelectData/SelectData', {
              method: 'GET',
              headers: {
                'Content-Type': 'application/json;charset=UTF-8'
              },
            })
              .then(handleErrors)
              .then(response => response.json())
              .then(selectData => {
                dispatch({ type: RECEIVE_SELECT_DATA, payload: selectData })
                saveSelectData(selectData)
              });

            return saveSelectData(selectData);
          }
        })

      })
      .catch(error => {
        clearJwt()
        console.log('ERROR - LOGIN!',error)
      })
    addTask(task)
    return task
  }

编辑

经过几个小时的破解,我终于可以开始工作了。这是完成的操作:

export const requestLoginToken = (username, password) =>
  (dispatch, getState) => {
    dispatch({ type: REQUEST_LOGIN_TOKEN, payload: username })

    const payload = {
      userName: username,
      password: password,
    }

    const task = fetch('/api/jwt', {
      method: 'POST',
      body: JSON.stringify(payload),
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      },
    })
      .then(handleErrors)
      .then(response => response.json())
      .then(data => {
        dispatch({ type: RECEIVE_LOGIN_TOKEN, payload: data })
        saveJwt(data)

        // Now check local storage for dropdown data..
        if (!confirmSelectDataExistance()) {
          dispatch({ type: REQUEST_SELECT_DATA })
          const token = JSON.stringify(data)
          const headers = new Headers({
            'Authorization': `Bearer ${token}`
          })
          const retrieveSelectData = fetch('/api/SelectData/SelectData', {
            method: 'GET',
            headers: {
              'Content-Type': 'application/json;charset=UTF-8'
            },
          })
            .then(handleErrors)
            .then(response => response.json())
            .then(selectData => {
              dispatch({ type: RECEIVE_SELECT_DATA, payload: selectData })
              saveSelectData(selectData)
            });

        }
      })

      .catch(error => {
        clearJwt()
        console.log('ERROR - LOGIN!', error)
      })
    addTask(task)
    return task
  }

这是它调用的函数:

export const confirmSelectDataExistance = () => {
  const companyStateShortNameJson = localStorage.getItem(COMPANYSTATESHORTNAME)
  const statesJson = localStorage.getItem(STATES)
  const suburbLocationsJson = localStorage.getItem(LOCATIONS)
  if (companyStateShortNameJson || statesJson || suburbLocationsJson) {
    console.log('something exists in localstorage')
    return true
  }
    console.log('nothing in localstorage')
  return false
}

我从其他尝试中改变的一件事是我使用“数据”而不是调用“getJwt()”。然后我使用了这条线:

const token = JSON.stringify(data)

获取我刚刚得到的JWT。

最后,我使用了@Karin 的答案并以此运行。 (由我点赞)

【问题讨论】:

  • confirmSelectDataExistance 如果要使用then,则需要返回Promise
  • 这应该如何构建才能发挥作用..

标签: javascript reactjs react-redux redux-thunk


【解决方案1】:

错误并不是说confirmSelectDataExistance 不是一个函数,而是说then 不是从它返回的函数的函数,它是一个布尔值(它相当于false.then(...),它不起作用)。

如果您似乎正在尝试使用 then 作为条件。在这种情况下,一个简单的if 语句应该可以工作:

if (confirmSelectDataExistance()) {
    // do things if it returns true
} else {
    // do things if it returns false
}

【讨论】:

  • 尝试了这个解决方案并得到了与以下相同的错误:(“TypeError: (0, _localStorageDropDowns.confirmSelectDataExistance) is not a function at reducer.js:43” ...它仍然说我的函数不是函数...
  • 您确定函数导入正确吗?如果不查看代码尝试,很难判断出了什么问题。
  • 很高兴它的工作!通常你不需要使用 Promises,除非你需要回调(通常是异步发生的事情)。由于您的 confirmSelectDataExistance 方法没有发出 AJAX 调用或任何东西,因此使用 Promises 似乎有点过头了。
【解决方案2】:
export const confirmSelectDataExistance = () => {

  return new Promise(function (resolve, reject) {

  const companyStateShortNameJson = localStorage.getItem(COMPANYSTATESHORTNAME)
  const statesJson = localStorage.getItem(STATES)
  const suburbLocationsJson = localStorage.getItem(LOCATIONS)
  if (companyStateShortNameJson || statesJson || suburbLocationsJson) {
    console.log('something exists in localstorage')
    resolve(true)
  }
  console.log('nothing in localstorage')
  reject(false)
 })
}

【讨论】:

  • 我确实按照我的编辑让它工作了,但我认为这也可以工作,虽然我没有尝试过......所以放心 bl%^dy 事情正在工作!
【解决方案3】:

试试这样的:

export const confirmSelectDataExistance = new Promise((resolve, reject) => {
  const companyStateShortNameJson = localStorage.getItem(COMPANYSTATESHORTNAME);
  const statesJson = localStorage.getItem(STATES);
  const suburbLocationsJson = localStorage.getItem(LOCATIONS);
  if (companyStateShortNameJson || statesJson || suburbLocationsJson) {
    console.log('something exists in localstorage');
    resolve(true);
  }
    console.log('nothing in localstorage');
  reject(false); // or resolve(false) if you want handle this situation inside then block also
});

【讨论】:

  • 添加了这个并得到了这个错误:“localStorageDropDowns.js: Unexpected token, expected ;”并且它在拒绝后的“=>”上指示它。
  • 去掉"("之前的"Promise"之后的空格
  • 请再试一次,我将承诺包装到 ()
猜你喜欢
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2017-12-09
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多