javascript - 如何在传奇中使用警报,将其挂起,并且仅在按下按钮时才继续?
问题描述
我对 redux-saga 还不是很熟悉。我正在尝试在 saga 函数中使用警报,以防 API 超时响应。我正在强制返回超时并且警报正在工作。
然而,传奇还在继续。我不知道如何暂停它,只有在用户按下警报上的“确定”按钮时才继续。我的目的是在警报或模式中显示连接或 API 问题,并且只有在恢复后才会继续。
function* sagaExample (action) {
// code
const response = yield call(apiRequest, data) // It will return "TIMEOUT" string in case of timeout
if (response === "TIMEOUT") {
var timeout = yield call(function* () {
try {
Alert.alert(
"No connection",
"Message",
[{text: "OK", onPress: function() { return true }}], // I want this function to make Saga continue
{cancelable: true},
)
} catch(error) {
return error
}
});
}
console.log(timeout) // It returns undefined
if (timeout) {
// it never runs
}
// code
}
这是使用try/catch
. 我尝试了不同的类似方法,例如调用生成器函数。
我搜索了很多,但我不知道我错过了什么。我不确定如何让它真正暂停 saga 功能并适当地响应警报按钮。
解决方案
您可以为您的Alert
调用创建一个包装器,该包装器在完成后解决一个承诺:
function wrappedAlert() {
return new Promise(resolve => {
Alert.alert(
"No connection",
"Message",
[{text: "OK", onPress: function() { resolve(); }}], // I want this function to make Saga continue
{cancelable: true, onDismiss: function() {resolve(); }},
)
});
}
const response = yield call(apiRequest, data) // It will return "TIMEOUT" string in case of timeout
if (response === "TIMEOUT") {
var timeout = yield call(wrappedAlert);
}