当前位置: 首页 > 面试题库 >

返回Promise结果而不是Node.js中的Promise

平航
2023-03-14
问题内容

背景

我正在尝试学习承诺,并且我有一个希望改进的承诺链。

问题

在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。

以下面的示例为例,该示例使用了Promise链接:

let myObj = new MyClass();

myObj.getInfo()
    .then(result => writeOutput(FILE_NAME, result))
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

class MyClass{

    getInfo() {
        return new Promise(function(fulfil, reject) {
            fulfill("I like bananas");
        });
}

在这里,我必须链接2次。但是,如果我直接从方法getInfo()中返回结果而不是返回Promise,则可能会执行以下操作:

let myObj = new MyClass();

let str = myObj.getInfo();

writeOutput(FILE_NAME, str)
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

问题

如您所见,我有些困惑。

  1. 鉴于getInfo()实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相似的代码?
  2. 如果有可能,这是个好主意吗?你会怎么做?

问题答案:

如果调用某个函数时该值立即可用(在事件循环的同一滴答处),则只能从该函数返回一个值。请记住,这return同步的。

如果无法立即使用它,那么您只能返回一个承诺(或者您可以使用回调,但是在此专门询问承诺)。

有关更详细的说明,请参见我前一段时间写的一个答案,该问题询问如何从某个函数返回AJAX调用的结果



 类似资料:
  • 我正在尝试用Akka / Scala编写一个actor,调用HTTP REST API并将结果发送回调用actor。API 可能会返回结果的集合/向量,必须首先将其转换为内部供应商中性格式,以便将来可以更改供应商,而无需对代码进行太多更改。大多数代码都在工作,但我不知道如何解压缩并发送内部向量。 这是我拥有的代码,它向调用的Actor返回一个。我想返回的是最终操作中创建的实际向量: 主叫演员: 如

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 我试图用Java创建一个XPath表达式(8,默认XPath实现)。我正在做以下工作: 我在同一级别的文档中有多个PartyId节点,因为它的父节点是重复的。我得到了结果,但只有一个节点。(第一)。 补充信息:如果我在表达式的末尾写[$k],比如[1]或[2],我得到了我的元素,但是我需要它们。:( 但是,如果我正在测试同一个XPath,例如http://www.freeformatter.com

  • 我在试用GraphQL。我从postgresql中提取数据,除了一个问题,解析在查询完成之前就完成了,其他一切似乎都能正常工作。我以为我的查询承诺工作正常。这里是我为查询数据库而创建的类: 下面是我的graphql查询: 我注释了我的结果,只是想了解一下返回静态内容的情况,结果似乎在then()内时不会返回到graphisql(这意味着在then()之前完成的解析)。输出: } 我可以通过将静态返

  • 我想从一个MariaDB数据库获取数据,并通过Maven安装了MariaDB JDBC连接器。下面的代码将数据的参数而不是实际的行/单元格数据添加到组合框中(请参见代码段,第10行)。这就是我要解决的问题。如果重要的话,我的表由1个int和4个varchar组成。 代码段(带行计数):

  • 我有一个 asp.net MVC 2 Web 应用程序在所有中间层控制器操作中,我捕获所有异常,记录,然后重新抛出异常。此重写由 JQuery Ajax 错误处理程序拾取 我正在通过JQuery进行一个ajax调用,如下所示 出于某种原因,jqXHR。responseText不再返回任何内容,我在解析responseText时遇到错误。我认为这可能是IIS设置,因为我们最近切换到新的Web服务器。