首页 > 解决方案 > 如何在传奇中使用警报,将其挂起,并且仅在按下按钮时才继续?

问题描述

我对 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 功能并适当地响应警报按钮。

标签: javascriptreact-nativeecmascript-6redux-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);
}

推荐阅读