undefined不是一个对象(评估Promise .then)

时间:2017-10-05 09:57:20

标签: javascript react-native ecmascript-6 promise es6-promise

我在开发反应原生移动应用程序时遇到此错误。

fetchDB函数将返回一个承诺

 fetchDB(key) {
    try {
      AsyncStorage.getItem(key, result => {
        return result;
      });
    } catch (error) {
      console.log(error);
    }
  }
}

使用.then()

从返回的承诺中获取值
  getUserName = () => {
    var user = Storage.fetchDB("username");
    user.then(res => {
      alert(res);
    });
  };

呈现红色屏幕时显示错误

  

undefined不是对象

1 个答案:

答案 0 :(得分:2)

1)您需要显式返回promise函数。失败情况可以在catch回调中处理:

fetchDB(key) {
 return AsyncStorage.getItem(key).catch(error => console.log(error));
}

fetchDB("username").then(res => alert(res));

2)只有当AsyncStorage.getItem真正返回承诺时,Point(1)才有效。如果不成立,那么您需要将AsyncStorage.getItem方法更新为基于承诺的方法。如果您无法访问该方法或不想触摸它,也可以通过以下方式更新fetchDB功能来解决问题:

fetchDB(key) {
  return new Promise((resolve, reject) => {
    try {
      AsyncStorage.getItem(key, resolve);
    } 
    catch (error) {
      reject(error);
    }
  })
}

fetchDB("username")
  .then(res => alert(res))
  .catch(error => console.log(error));

3)我甚至会说,由于es6 Promises性质,你不需要尝试捕获:

fetchDB(key) {
  return new Promise((resolve, reject) =>
    AsyncStorage.getItem(key, resolve)
  )
}

fetchDB("username")
  .then(res => alert(res))
  .catch(error => console.log(error));

最后.catch处理从fetchDB承诺中抛出的任何错误。