当前位置: 首页 > 知识库问答 >
问题:

javascript - js中for与map在返回promise时的区别?

申屠森
2024-01-26

遇到一个问题:下面是拿到一个数组返回,通过遍历返回一个值,我之前习惯用map去遍历。

const getCapture=async ()=>{  let result=await ipcRenderer.invoke('goCapture-event')  for(const m of result){    if(m.name==='整个屏幕'){      let str=m.thumbnail.crop({x:0,y:0,width:1200,height:1170})      const imgSrc=str.toDataURL()      return imgSrc    }  }/*  result.map(m=>{    if(m.name==='整个屏幕'){      console.log(m)     let str=m.thumbnail.crop({x:0,y:0,width:1000,height:1000})     const imgStr=str.toDataURL()     return  imgStr    }  })*/}

这是map的遍历:

result.map(m=>{    if(m.name==='整个屏幕'){      console.log(m)     let str=m.thumbnail.crop({x:0,y:0,width:1000,height:1000})     const imgStr=str.toDataURL()     return  imgStr    }  })

这样返回的竟然是空,
但是如果用for,就可以正确返回:

for(const m of result){    if(m.name==='整个屏幕'){      let str=m.thumbnail.crop({x:0,y:0,width:1200,height:1170})      const imgSrc=str.toDataURL()      return imgSrc    }  }

js中for和map还有这区别吗?

共有5个答案

夏侯兴学
2024-01-26

你这是基础的问题,你上面的getCapture执行后会 return 一个imgSrc,你想要的结果只是result中的一个值,它本身不是数组。我搞不懂你这边为什么要用map去执行,map的结果是返回数组,跟你原本的结果不一致,而且如果你要使用map,代码应该这样写:

const getCapture=async ()=>{  let result=await ipcRenderer.invoke('goCapture-event')  return result.map(m=>{    if(m.name==='整个屏幕'){      console.log(m)     let str=m.thumbnail.crop({x:0,y:0,width:1000,height:1000})     const imgStr=str.toDataURL()     return imgStr    }  })[0] || "";  }

这样写才能有你上面代码的效果。

给你贴一个map简易的实现原理,我几年前写的,你对map的理解不够。

Array.prototype.myMap = function (fun) {    const arr = [];    for (let i = 0; i < this.length; i++) {        const val = fun.call(this, this[i], i, this)        arr.push(val);    }    return arr;}
白腾
2024-01-26

你的if里面判断成功了才返回imgSrc ,如果判断不成功呢? 什么都不返回,那不就是空?
js基础不牢固啊,老弟

蒋乐意
2024-01-26

d232332

强承望
2024-01-26

跟 Promise 一点儿关系都没有,甚至跟 map() 也没啥关系。这是最基本的 JS 语法问题。

const bar = (callback) => callback();const foo = () => {    bar(() => {        return 1;    });}let ret = foo(); // undefined/* ----------------- */const foo = () => {    for (;;) {        return 1;    }}let ret = foo(); // 1

看明白了吗?第一种写法里 foo 函数有返回值吗?你说你写了 return,那是 bar 的回调函数里的返回值,foo 函数自己有吗?

翟单弓
2024-01-26

map的回调函数内部用return语句,返回给了map内部的匿名函数,外层的getCapture函数没有接到,所以返回的是空,修改成这样接收:

//getCapture函数内部const mappedResult = result.map(m => {    if (m.name === '整个屏幕') {      console.log(m)      let str = m.thumbnail.crop({x: 0, y: 0, width: 1000, height: 1000})      const imgStr = str.toDataURL()      return imgStr    }    return undefined; }); return mappedResult.find(imgStr => imgStr !== undefined);
 类似资料:
  • 我正在努力理解如何在Javascript中获得一个承诺的值,以便能够检查它是真的还是假的。 如果我console.log有效变量,它将返回以下内容: 在我的if语句中,我试图检查允诺值是否为真,但我不知道如何访问该值:/谁能告诉我如何检查该值吗? 谢谢

  • 我使用类型TreeMap定义了一个集合 我想返回与包含给定字符串值的列表配对的字符串(TreeMap键)。例如,我有一个字符串“bob”存储在列表中的一对中,我想返回与“bob”所在的对列表相关联的Treemap的键(字符串)。我将如何执行此操作?

  • 问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相

  • 我有这个功能: 在控制台中返回: Promise{[[PromiseState]]:"待定",[[PromiseValue]]:未定义} proto[[PromiseStatus]]:“已解决” 我需要访问对象中的名称/值对,但无法访问它们。我假设在将响应转换为json后,我需要多做一步,但我无法理解。如果有人能帮忙,我们将不胜感激!

  • 本文向大家介绍Mybatis中返回Map的实现,包括了Mybatis中返回Map的实现的使用技巧和注意事项,需要的朋友参考一下 在Mybatis中,我们通常会像下边这样用: 返回一个结果 返回多个结果(其实这个和上边一样,只不过是查询条件的控制而已) 我们只要将上边的resultType改为java.util.HashMap,这会有生成下边这样 上这结果就是说,以User类的属性名为key,属性值

  • 问题内容: 我想使用这样的Promise来调用Google Maps Geocoding API: 当我调用函数请求时,我发现我得到了一个Promise而不是一个值: 为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值? 问题答案: 如果您依赖承诺来返回数据,则必须从函数中返回承诺。 一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步