Javascript yield是异步函数中的保留关键字错误
我需要使用window.chrome.storage从chrome存储中获取用户电子邮件,并检查该电子邮件是否与response.data.email中登录的用户电子邮件相匹配。如果匹配,则分派成功函数else error。但是,我得到一个错误“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
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,它看起来更简单)…因此,检查文档,看看有什么可能性,然后思考如何使其工作,从我看来,您似乎非常了解该语言,因此它似乎是一个信息问题,而不是一个技术问题;)