承诺与承诺解决分开

时间:2016-11-21 12:44:03

标签: javascript node.js promise

我对承诺不太熟悉。 我想隐藏promise-call中的promise-implementation。

示例:

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分开?

1 个答案:

答案 0 :(得分:3)

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

在作用于此函数的局部变量promiseFriend中保存promise是没有意义的。在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的异步性,请参阅以下答案:

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