我是全新的反应本地人,我一直在浏览代码片段,并对如何传递承诺感到困惑。
我有一个事件处理程序onRefresh()
,当我在平面列表中下拉时我会尝试让它在返回true / false时使用apiSearchDB
的返回值。
onRefresh = () => {
this.setState({...}, () => {
return this.apiSearchDB()
.then(function(response) {
console.log(response);
})
.catch((error) => {
console.log(error);
});
})
}
apiSearchDB = () => {
return fetch('/some_endpoint')
.then((response) => response.json())
.then((json) => {
this.setState({
...
}, () => {return true})
return true;
}).catch((error) => {
console.error(error);
return false;
})
}
第console.log(response);
行仅打印undefined
,我无法弄清楚原因。
我的处理程序也可以写成
onSearch = () => {
return new Promise((resolve, reject) => {
var response = this.apiSearchDB();
response
? resolve();
: reject();
}
});
}
或onSearch = () => {...}
和function onSearch(){...}
?
提前谢谢!
答案 0 :(得分:1)
您应该阅读有关使用promises的更多信息(好文章 - We have a problem with promises)。但是,在这种情况下,有两个基本规则可以帮助您:
apiSearchDB
应返回包含json
作为已解析值的承诺,并error
作为被拒绝的值:
apiSearchDB = () =>
fetch('/some_endpoint')
.then((response) => response.json())
.then((json) => json)
// can be removed unless you want to do something with the error before passing it on
.catch((error) => Promise.reject(error));
onRefresh
(或onSearch
)方法应该从apiSearchDB
获得承诺,并添加它自己的链。应使用then
处理程序处理Resolve promise。如果它是被拒绝的值,它将由catch
处理程序处理:
onRefresh = () =>
this.apiSearchDB()
.then((response) => {
console.log(response);
// do something with response
this.setState({...}, () => {
});
return response;
})
.catch((error) => {
console.log(error);
// do something with error
this.setState({...}, () => {
});
});
}