簡體   English   中英

yield是異步函數內部的保留關鍵字錯誤

[英]yield is a reserved keyword error inside async function

我需要使用window.chrome.storage從chrome存儲中獲取用戶電子郵件,並檢查該電子郵件是否與從response.data.email登錄的電子郵件匹配。 如果匹配,則分派成功函數,否則返回錯誤。 但是,我收到一個錯誤消息,“ 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_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)調用函數。 在某種程度上,這是一種易讀且有組織的方法。 我不了解異步/等待,所以高度贊賞異步/等待中的答案。 以不同的方式解決問題會給出解決問題的不同思路,從而增加了各個領域的知識。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM