2016-11-21 133 views
-1

我不太熟悉承诺。 我希望隐藏诺言 - 诺言的实现。承诺呼叫与承诺分辨

例子:

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”是未定义的。 如何将承诺呼叫与承诺解决方案分开?

+0

你能发布更多的代码吗?你在哪里打电话给“findFriends”,你准确地称呼诺言? 我可以告诉你有关承诺的一件事 - 只要你不在代码的某个地方调用'then',承诺就不会被解决。解决之后,您可以根据需要多次调用相同的'then',并返回相同的值(已解决)。 promiseFriend未定义与承诺无关 - 它只是意味着在您调用promise的地方,这个变量是未定义的。 – SzybkiSasza

回答

3

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

在作为该功能范围的本地变量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编程在理解函数调用,返回值,回调以及在这种情况下的承诺之前,先准备好rams。

+0

thx。为了解释。我只看到了一些简单的承诺例子,但是当我会变得更加复杂时,我想看看它是如何设计的。 –