承诺与承诺分开

我不太熟悉承诺。 我希望隐藏诺言 - 诺言的实现。

例:

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-call与promise-resolution分离开来?


如果你想在一个函数中定义一个承诺并在其他地方使用它,那么首先你需要从该函数中返回承诺,这是你在代码中没有做的。 然后你需要实际调用你也没有做的功能。 最后,你需要使用then回调的返回值,你是不是在这种情况下这样做,以及。

将promise限制在本函数范围内的本地变量promiseFriend中是毫无意义的。 还有没有点返回你的一个值then回调: .then(function (friends) { return friends; }) -我不知道你有什么想在这里做。

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

那么你可能会从你的函数中返回承诺,但如果它是一个路由处理程序,那么它就没有意义了。 您可以从函数返回一个承诺:

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

然后使用它:

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

但如果不返回它,则不能使用返回值,不能像定义的那样使用未定义的变量,并且实际上需要考虑返回值的返回值。

我建议你学习Node是如何工作的,因为你似乎已经复制并粘贴了一些随机代码,并将它们结合在一起,期望它能够实现你想要的,而不需要真正理解它。

为了更好地理解在此给出执行顺序的Node的异步特性,请参阅以下答案:

  • 有关如何使用回调和承诺的详细说明
  • 有关如何在复杂的请求处理程序中使用promise的说明
  • 关于AJAX请求的例子,解释了什么是承诺
  • 解释回调,承诺以及如何访问异步返回的数据
  • 在理解函数调用,返回值,回调的概念之前,不要试图编写Node程序,在这种情况下,承诺。

    链接地址: http://www.djcxy.com/p/55347.html

    上一篇: promise call separate from promise

    下一篇: Should I refrain from handling Promise rejection asynchronously?