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

承诺电话与承诺解决方案分开

申博厚
2023-03-14
问题内容

我对诺言不太熟悉。我想从承诺电话中隐藏承诺的实现。

例:

function findFriends(req, res) {

    const promiseFriend  = MyFriendes.find({}).exec(); //call promise

    if(friends.length===0){
        logger.warn('No friendsavailible');
    }else if(friends === undefined){
        res.status(500).json({
            error: 'INTERNAL ERROR'
        });
    }else{
        res.status(200).json({
            friends: friends
        });
    }
}

然后我将在同一文件中而不是在同一函数中解决我的诺言,我称其为诺言。

 promiseFriend  
        .then(function(friends){
            return friends;
        })
        .catch(function(err){
            logger.error({error:err});
        });

现在,我知道“ promiseFriend”是不确定的。我如何才能将承诺电话与承诺解决方案区分开?


问题答案:

如果要在函数中定义一个promise并在其他地方使用它,则首先需要从该函数返回promise,而您在代码中没有这样做。然后,您需要实际调用您也没有执行的功能。最后,您需要对then返回的值使用回调,在这种情况下您也不会这样做。

将promise保存在promiseFriend该函数的局部变量中没有意义。也没有必要在您的then回调中返回值:.then(function (friends) { return friends; })-我不知道在这里尝试做什么。

我想这findFriends应该是Express的路由处理程序。如果是这样,请确保您在每种情况下都发送响应(您不为此做friends.length===0)。另外,then如果您想在解决承诺时采取行动,则实际上需要向已保存的承诺添加处理程序。现在,您甚至都没有friends在函数中定义。还要添加一个catch处理程序,并针对这种情况发送响应。

然后,您可以从函数中返回promise,但是如果它是一个路由处理程序,则不会,这没有任何意义。您可以从函数返回诺言:

function x() {
  return MyFriendes.find({}).exec();
}

然后使用它:

x().then(friends => ...).catch(error => ...);

但是如果不返回,就不能使用返回值,不能像定义变量一样使用未定义的变量,实际上您需要考虑返回的值是谁。

我建议您了解Node的实际工作原理,因为您似乎已经复制并粘贴了一些随机代码,将其合并在一起,并期望它可以完成您想要的操作而无需真正理解它。

在理解函数调用,返回值,回调以及在这种情况下的承诺之前,不要尝试编写Node程序。



 类似资料:
  • 问题内容: 我要兑现一个承诺。关键是我真的想在第一个诺言兑现后立即访问(仍在等待中的)第二个 诺言 。不幸的是,当两个诺言都实现时,我似乎只能获得第二个诺言的解决值。 这是我想到的用例: 该功能显示文件选择器,用户可以在其中从自己的硬盘驱动器或URL中选择文件。它返回一个承诺,该承诺将在用户选择文件后立即兑现。此时,我们可能仍然必须通过网络下载所选文件。因此,我不能将所选文件作为分辨率值。相反,应

  • 问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困

  • 问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()

  • 问题内容: 无论我的Promise是否成功解决,我都想执行相同的操作。我不想将相同的功能绑定到两个参数。没有像jQuery一样的东西吗?如果没有,我该如何实现? 问题答案: 没有像jQuery一样的东西吗? 如果没有,我该如何实现? 您可以这样实现自己的方法: 或更广泛地讲,将解析信息传递给回调: 两者都确保原始解析得以维持(当回调中没有异常时),并确保等待诺言。

  • 问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您

  • Promises是一种在JavaScript中实现异步编程的简洁方法(ES6新功能)。 在承诺之前,Callbacks用于实现异步编程。 让我们首先了解异步编程及其实现,使用Callbacks。 了解回调 函数可以作为参数传递给另一个函数。 这种机制被称为Callback 。 回调对事件有帮助。 以下示例将帮助我们更好地理解这一概念。 <script> function notifyA