【发布时间】:2020-08-18 15:54:33
【问题描述】:
我正在尝试查看页面/img 是否使用 javascript onload 和 onerror 成功加载。我正在尝试读取状态变量,但是当我分配变量来读取状态时无法这样做。 我正在尝试使用提供的可能答案中概述的承诺,但仍然有些困惑。
const validateInput = (input) => {
const errors = {};
...
if(!(isImgURlValid(input)))
{
errors = `wrong image'`
}
...
return errors;
const isImgURlValid = (path) => {
let img = document.createElement('img');
img.src = path;
let valid
const promise = new Promise(resolve => {
const img = new Image();
img.onload = () => resolve({path, "status": 'ok'});
img.onerror = () => resolve({path, "status": 'error'});
img.src = path;
});
promise.then(function(val) {
console.log(val);
valid = val.status
});
console.log (valid)
}
//when I use async, my render functions no long render the errors properly
export const renderImgUrlInput = ({ input, label, type, size, required, meta: { touched, error } }) => (
<div className={
cs('form-group', size, {
'has-error': touched && error,
'required-input' : required
})
}>
<label className="control-label" htmlFor={input.name}>{label}</label>
<input {...input} placeholder={required ? 'Required' : ''} className="form-control" />
{touched && error &&
<span className="help-block">{error}</span>
}
{touched && !error &&
<h1 className="help-block">{error} 'Image worked'</h1>
}
</div>
)
【问题讨论】:
-
这就是我阅读的文档并继续使用承诺,但仍然对此有些困惑。
-
您只有在解析调用成功完成后才能访问valid,@LisaDane,在那之前,valid 将是未定义的,因为promise 尚未解决或拒绝。公平地说,您的 isImgURlValid 应该返回承诺而不是未定义,然后该函数的使用者需要使用 then/catch 链来验证它
-
我明白你在说什么。我编辑了我的代码并添加了更多部分以在上下文中更多地显示它。那么我怎样才能将值提升到我的函数 isImgURLvalid
-
@LisaDane 我更新了我的答案以反映这一点,但这对你没有帮助,你必须在代码中的某个时间处理异步调用的承诺或结果,所以尽早处理
标签: javascript ecmascript-6 promise onload