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

在JavaScript中promise{挂起},异步,等待

温凯
2023-03-14

我试图理解为什么这段代码返回“Promise{pending}”。

const reduceDirections = (str) => {
    str = str.replace(/northsouth|southnorth|eastwest|westeast/ig, '')

            if (str.search(/northsouth|southnorth|eastwest|westeast/ig) === -1) {
                str = str.replace(/south|north|west|east/gi, '$& ').replace(/(^\s+|\s+$)/,'')
                console.log(str)
                return str

            } else {
                reduceDirections(str)
            }  
}

async function start(arr) {
    str = arr.join('')
    let res = await reduceDirections(str)
    return Promise.resolve(res)
}

console.log(start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]))

当我通过reduceDirections()函数console.log(str)时,我可以看到我得到了想要的结果。但是当我(一行之后)返回str时,我会改为“Promise pending”

很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

共有1个答案

扶誉
2023-03-14

几个问题:

1) reduceDirections中没有异步发生,也没有返回promise,因此在其上使用wait是没有意义的。

2) 函数的递归部分不会返回递归结果,因此请更改:

 } else {
     reduceDirections(str)
 }  

致:

 } else {
     return reduceDirections(str)
 }  

然后至少可以希望有一个有用的字符串作为返回值

3)如果你真的坚持在同步返回的东西上使用wait,那么你可以保留它,但没有必要这样做

return Promise.resolve(res)

...因为一个async函数总是返回一个promise。所以就这么做吧

return res;

4)你不能等到那个promise得到解决。因此,您应该等待它的解析值,并在此基础上使用console.log。更改:

console.log(start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]))

致:

start(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]).then(console.log)

但同样,在这里使用promise是无用的,只会使代码复杂化。你从中得不到任何好处。

 类似资料:
  • 我看了类似的问题,没有找到一个解决方案,我可以实现到我自己的代码,因此我做了这篇文章。我有以下代码: 最后一个console.log返回undefined,尽管pool.query中的console日志提供了我要查找的正确字符串。我尝试过的这段代码的另一个版本给出了暂挂的promise,而不是未定义的promise。 通过阅读其他文章,我理解这是因为我没有将wait与async函数一起使用。问题是

  • 我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。

  • 如果我有这个功能 然后投入140000000,那么这将需要一秒钟来完成。如果我需要返回的值来继续一个函数的其余部分,我想我需要等待响应,这样我就可以使用响应了 但事实上,我认为它与其说是一个值,我需要传递到下一个函数中,让它工作,所以它基本上没有等待响应,因为它基本上发送一个函数作为参数,如 所以,也许我在这里花了很多时间,但基本上,我如何实现同步编程,什么不适合速度,什么是正确使用异步和prom

  • 我想使用异步并等待处理承诺。我想在下面的示例中使用这个方法: 在执行时,它给了我一个错误 错误: UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:3)

  • 本文向大家介绍JavaScript 异步等待循环,包括了JavaScript 异步等待循环的使用技巧和注意事项,需要的朋友参考一下 示例 在循环中使用异步等待时,您可能会遇到其中一些问题。 如果您只是尝试在内部使用await forEach,则会抛出Unexpected token错误。 这是因为您错误地将箭头功能视为一个块。该await会在回调函数,这是不是上下文async。 解释器可以防止我们

  • 我正在尝试运行一个for循环,它将一组异步请求排队。所有请求完成后,不管它们是还是,我都想运行一些代码。我试图利用异步/等待模式,因为它看起来更好。:) 这就是我正在做的: 然而,有些promise失败了,第二种情况是也会失败。 我想简单地忽略任何失败的promise,并在所有promise完成后运行下一段代码。 我找到了这样的解决方案。 但当试图将其转换为异步/等待格式时,它看起来不起作用。 我