Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript yield是异步函数中的保留关键字错误_Javascript_Reactjs_Redux_Redux Saga - Fatal编程技术网

Javascript yield是异步函数中的保留关键字错误

Javascript yield是异步函数中的保留关键字错误,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,我需要使用window.chrome.storage从chrome存储中获取用户电子邮件,并检查该电子邮件是否与response.data.email中登录的用户电子邮件相匹配。如果匹配,则分派成功函数else error。但是,我得到一个错误“yield是一个保留关键字”。那么我该如何让它工作呢 这就是我所做的 function* setSessionAndLogin(response, headers, successCB, failureCB) { if (response.dat

我需要使用window.chrome.storage从chrome存储中获取用户电子邮件,并检查该电子邮件是否与response.data.email中登录的用户电子邮件相匹配。如果匹配,则分派成功函数else error。但是,我得到一个错误“yield是一个保留关键字”。那么我该如何让它工作呢

这就是我所做的

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\u 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;
}

这里我得到一个空数组

我用承诺解决了这个问题。如果异步操作必须在生成器内部执行,则可以采用以下方法进行选择

使用
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);
        });
    });
}

你的
yield put(successCB(response.data))
yield put(failureCB('Email not match')
似乎是回调的一部分,而不是生成器函数的一部分。你确定你的意思是
async
函数,因为我在这里没有看到关键字,但我确实看到了生成器函数(*)这里。还有,你将如何使用这个函数,你确定生成函数是正确的方法吗?@Icepickle我已经用我尝试过的解决方案来解决我的问题。你真的应该后退一步。目前看来你只是在尝试尽可能多的事情,但你犯了一些有趣的错误。在解决方案1中,你屈服于你r回调,而不是在主生成器函数中,因此您的收益率很好,完全没有必要。解决方案2使用回调来更新块作用域变量,您似乎在等待它,但这意味着get将返回一个承诺(这似乎不太可能,因为您也提供了回调函数).因此,退一步,分析问题(我更喜欢解决方案2,它看起来更简单)…因此,检查文档,看看有什么可能性,然后思考如何使其工作,从我看来,您似乎非常了解该语言,因此它似乎是一个信息问题,而不是一个技术问题;)