Javascript 承诺正在回归[目标承诺]
我试图做一个基本的检查,看看图像是否是视网膜,是否有人像比例。我所有的检查功能都工作得很好。我的问题是,在应该返回我从检查中得到的布尔值的最后一个函数中,它返回的是Javascript 承诺正在回归[目标承诺],javascript,promise,Javascript,Promise,我试图做一个基本的检查,看看图像是否是视网膜,是否有人像比例。我所有的检查功能都工作得很好。我的问题是,在应该返回我从检查中得到的布尔值的最后一个函数中,它返回的是[对象承诺]。我不知道为什么在我解决承诺时这不返回我的布尔值 当我运行.then(res=>console.log(res))时,它输出我的布尔响应,但是返回承诺的函数getImageMeta()只返回了[object promise],这使我认为承诺实际上没有得到解决 如果我能得到一些帮助,那就太好了 /**************
[对象承诺]
。我不知道为什么在我解决承诺时这不返回我的布尔值
当我运行.then(res=>console.log(res))
时,它输出我的布尔响应,但是返回承诺的函数getImageMeta()
只返回了[object promise]
,这使我认为承诺实际上没有得到解决
如果我能得到一些帮助,那就太好了
/************************************
Check if image is retina portrait
************************************/
const checkIfPortrait = src => !isRetina(src) ? false : getImageMeta(src).then(res => res);
const isRetina = src => src.indexOf('@2x') !== -1;
const isPortrait = ({ naturalWidth, naturalHeight }) => naturalHeight > naturalWidth ? true : false;
function getImageMeta (src) {
const img = new Image();
img.src = src;
return new Promise((resolve, reject) => {
return img.addEventListener("load", function () {
return resolve(isPortrait(this));
}, false);
});
}
export { checkIfPortrait }
以下是我调用函数的方式:
<img src={media[i].image} alt={media[i].alt} data-portrait={checkIfPortrait(media[i].image)} />
这是预期结果。当您返回一个
新承诺
对象时,它将始终是一个承诺对象([object Promise]
字符串化时)
您可以使用.then
方法(或在异步
函数中使用wait
)访问承诺的结果。然后,当/如果结果可用时调用您的。然后
回调,这将在您调用resolve
之后发生,或者如果承诺之前已解决,则会很快调用它
函数getImageMeta(src){
返回新承诺(解决=>{
设置超时(()=>{
解析({元数据:`for:${src}`});
}, 100);
});
}
getImageMeta('test.png')。然后(meta=>{
console.log(meta);//{“元数据”:“for:test.png”}
});
(异步()=>{
const meta=wait getImageMeta('test.png');
console.log(meta);//{“元数据”:“for:test.png”}
})();代码>承诺的基本理念是,它会给你一些东西,让你立即归还,即使它要到后来才能解决。它代表了它的最终价值。因此,
getImageMeta()
立即返回承诺,即使它尚未解决
一旦您获得了由getImageMeta()
返回的承诺,您就可以使用它的then()
来等待最终的布尔值,它最早将出现在下一个事件循环周期中
使用当前代码,您正在将getImageMeta()
返回的承诺保存到checkiftrait
。因此,现在checkifratio
持有这个承诺,您可以调用then()
。由于您正在导出checkifratio
,您可能会调用导入它的模块:
// import checkIfPortrait
checkIfPortrait(src)
.then(ret_val => {
//you can access boolean here in ret_val
})
多亏大家的帮助,问题现在解决了。正如我所说的,问题是我在承诺得到解决之前调用了它的值,而在承诺得到解决之后,我无法更新该值 因此,我所做的是确保在运行函数之前可以访问图像数据。然后,一旦我有了一个解决的承诺,它就会更新图像数据,以显示它是否是纵向的 最后的代码如下所示:
const enhance = lifecycle({
componentWillMount: function () {
Object.keys(this.props.media).map((i) =>
checkIfPortrait(this.props.media[i].image)
? this.props.media[i].isPortrait = true
: this.props.media[i].isPortrait = false
);
}
})
您的函数返回promise,因此应将其称为promise
<img src={media[i].image} alt={media[i].alt} data-portrait={checkIfPortrait(media[i].image).then(result=>result})};
result});
Promise返回[object Promise],然后返回空值。
检查mongo DB的集合,确保访问路径正确。试试这个
function axiosTest() {
axios.get(url)
.then(response => response.data)
.catch(error => error);
}
async function getResponse () {
const response = await axiosTest();
console.log(response);
}
getResponse()
它是可以工作的,但是要获得响应的每个函数都需要是一个异步函数,或者使用一个额外的.then()
回调函数
function axiosTest() {
axios.get(url)
.then(response => response.data)
.catch(error => error);
}
async function getResponse () {
axiosTest().then(response => {
console.log(response)
});
}
getResponse()
如果有人知道避免这种情况的方法,请告诉我
还可以结帐Katsiaryna(Kate)Lupachova的。我想这会有帮助。看一看,了解更多关于承诺的信息<代码>。那么(res=>res)是多余的,您不需要它。“我的问题是,在应该返回布尔值的最后一个函数中”,这是不可能的。您无法将异步进程转换为同步进程。在异步函数中,除了服务调用之外,我忘了提到“wait”,因此出现了此错误。添加后问题得到解决。抱歉@BradyEdgar-我知道现在发生了什么。我不知道你正在将结果保存到CheckIfGrait并将其导出。检查并保留对承诺的引用。您将在
checkiFractive
上调用then()
。但是,承诺的工作方式无法直接访问价值,因为这样做太早了。您需要在then()
回调中处理它。
function axiosTest() {
axios.get(url)
.then(response => response.data)
.catch(error => error);
}
async function getResponse () {
const response = await axiosTest();
console.log(response);
}
getResponse()
function axiosTest() {
axios.get(url)
.then(response => response.data)
.catch(error => error);
}
async function getResponse () {
axiosTest().then(response => {
console.log(response)
});
}
getResponse()