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()