javascript - yield is a reserved keyword inside async function 错误

标签 javascript reactjs redux redux-saga

我需要使用 window.chrome.storage 从 chrome 存储中获取用户电子邮件,并检查该电子邮件是否与来自 response.data.email 的用户登录电子邮件相匹配。如果匹配,则调度成功函数,否则出错。但是,我收到“yield is a reserved keyword”的错误。我该如何让它发挥作用?

这是我做的

function* setSessionAndLogin(response, headers, successCB, failureCB) {
    if (response.data) {
        const sessionValue = Array.from(headers.entries()).reduce(
            (val, entry) => ({ ...val, [entry[0]]: entry[1] }),
            {}
        );

    // const results = yield call(() => {})
    window.chrome.storage.sync.get(['user_email'], result => {
      if (response.data.email === result.user_email) {
        yield put(successCB(response.data));
        window.chrome.storage.sync.set(
                { user_token: btoa(JSON.stringify(sessionValue)) },
                function() {}
            );
      } else {
            yield put(failureCB('Email does not match'));
        }
    });

    } else {
        yield put(failureCB(response.errors[0]));
    }
}

更新

我尝试过的解决方案

解决方案 1。

这里没有任何反应。我没有收到错误,但也收到了 console.log('result', result, result.user_email);不会在控制台中打印任何内容。

function* setSessionAndLogin(response, headers, successCB, failureCB) {
    if (response.data) {
        const sessionValue = Array.from(headers.entries()).reduce(
            (val, entry) => ({ ...val, [entry[0]]: entry[1] }),
            {}
        );
        window.chrome.storage.sync.get(['user_email'], function*(result) {
            console.log('result', result, result.user_email);
            if (result.user_email && response.data.email === result.user_email) {
                yield put(successCB(response.data));
                window.chrome.storage.sync.set(
                    { user_token: btoa(JSON.stringify(sessionValue)) },
                    function() {}
                );
            } else {
                yield put(failureCB('Email does not match'));
            }
        });
    } else {
        console.log('error');
        yield put(failureCB(response.errors[0]));
    }
}

解决方案 2

const results = yield call(fetchUserEmail)
async function fetchUserEmail() {
    let userEmail = [];
    const email = await window.chrome.storage.sync.get(['user_email'], result => {
        userEmail.push(result.user_email);
        console.log('userEmail', userEmail);
    });

    return userEmail;
}

这里我得到空数组。

最佳答案

我使用 promise 解决了这个问题。如果必须在生成器内部进行异步操作,您可以做的一种选择是以下方式。

使用 yield call(fetchUserEmail) 调用函数。在某种程度上,这是一种可读性和组织性强的方式。我不知道 async/await,所以非常感谢 async/await 中的答案。不同的解法给出了解决问题的不同思路,从而增加了对各个领域的知识。

function fetchUserEmail() {
    return new Promise((resolve, reject) => {
        let userEmail = [];
        window.chrome.storage.sync.get(['user_email'], result => {
            userEmail.push(result.user_email);
            resolve(userEmail);
        });
    });
}

关于javascript - yield is a reserved keyword inside async function 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51301858/

相关文章:

javascript - AngularJS $filter(date) 返回错误的格式

javascript - React.js 转译问题。 Babel 构建命令不起作用

javascript - react-router 在提供带路径的 url 时忽略嵌套路由

javascript - 如果帖子 ID 等于 action.payload,则增加点赞数

javascript - 如何从 Ajax Request 获取返回值并将其分配给一个元素?

javascript - 如何检查参数是否为对象?

javascript - Jasmine 和expect有什么区别吗?

reactjs - 使用babel从node_modules导入模块但失败

javascript - 优化 React-Redux 连接的 PureComponent

javascript - 内联样式和 ReactCSSTransitionGroup