我需要使用window.chrome.storage来从chrome存储中获取用户电子邮件,并检查该电子邮件是否与从response.data.email中登录的用户匹配。如果匹配,则分派成功函数,否则返回错误。但是,我收到一个错误消息,“ yield是保留关键字”。我该如何使其工作?
这是我所做的
#Get public and private function definition files.
$Public = @( Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction SilentlyContinue )
$Private = @( Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction SilentlyContinue )
$Enums = @( Get-ChildItem -Path $PSScriptRoot\Enums\*.ps1 -ErrorAction SilentlyContinue )
#Dot source the files
Foreach ($import in @($Public + $Private + $Enums)) {
Try {
. $import.fullname
} Catch {
Write-Error -Message "Failed to import function $($import.fullname): $_"
}
}
Export-ModuleMember -Function '*'
[string] $ManifestFile = '{0}.psd1' -f (Get-Item $PSCommandPath).BaseName;
$ManifestPathAndFile = Join-Path -Path $PSScriptRoot -ChildPath $ManifestFile;
if ( Test-Path -Path $ManifestPathAndFile) {
$Manifest = (Get-Content -raw $ManifestPathAndFile) | iex;
foreach ( $ScriptToProcess in $Manifest.ScriptsToProcess) {
$ModuleToRemove = (Get-Item (Join-Path -Path $PSScriptRoot -ChildPath $ScriptToProcess)).BaseName;
if (Get-Module $ModuleToRemove) {
Remove-Module $ModuleToRemove;
}
}
}
更新
我尝试过的解决方案
解决方案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] }),
{}
);
// 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]));
}
}
解决方案2
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]));
}
}
在这里我得到空数组。
答案 0 :(得分:0)
我用诺言解决了这个问题。如果必须在生成器内部进行异步操作,则可以采用以下方法。
使用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);
});
});
}