当前位置: 首页 > 知识库问答 >
问题:

如何使用promise避免回调地狱?[副本]

唐兴思
2023-03-14
{
  id: String,
  comments: [String], # id of Comments
  links: [String], #id of Links
}

按ID找到一个有评论和链接属于它的帖子:

Posts.findOne({id: id}, function(post) {
  Comments.find({id: post.id}, function(comments) {
    Links.find({id: post.id}, function(links) {
      res.json({post: post, comments: comment, links: links})
    })
  })
})

如何使用Promise(http://mongoosejs.com/docs/promissies.html)避免回拨地狱?

var query = Posts.findOne({id: id});
var promise = query.exec();

promise.then(function (post) {
  var query1 = Comments.find({id: post.id});
  var promise1 = query1.exec();
  promise1.then(function(comments) {
    var query2 = Links.find({id: post.id});
    var promise2 = query2.exec();
    promise2.then(function(links) {
      res.json({post: post, comments: comment, links: links})
    })
  })
});

好像不好......

共有1个答案

杨晓博
2023-03-14

尝试以下内容:

function getPost(id) {
  return Post
    .findOne({id: id})
    .then( post => {
      return post;
    });
}

使用Q模块

function getCommentsAndLinks(post) {
  return Q.all([
    Comment.find({id: post.id}),
    Links.find({id: post.id})
  ])
  .done( results => {
    let comments = results[0];
    let links = results[1];
    return [post, comments, links];
  })
  .catch( err => {
  // handle err
  })

在控制器上

getPost(postId)
.then(getCommentsAndLinks)
.then( results => {
  let post = results[0];
  let comments = results[1];
  let links = results[2];
  // more code here
})
.catch( err => {
// handle err
}) 
Post
.findOne({id: id})
.populate('comments')
.populate('links')
.then( post => {
    // here have the post with data of comments and links
});
 类似资料:
  • 本文向大家介绍如何避免回调地狱?相关面试题,主要包含被问及如何避免回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 你可以有以下方式避免回调地狱 模块化:将回调函数转换为独立的函数 使用流程控制库,例如[aync] 使用Promise 使用aync/await 使用来计算生成器或Promise 解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。  

  • 问题内容: 当我打开多个流并且必须获得一个绝对事件来完成逻辑时,如何避免使用类似递归的结构。 我有几个文件必须通过tp进行一些处理。如何设置一个事件,告诉我所有这些事件何时完成?目前,我得到的是每个事件都是单独的。 我绝对可以同时开始每个视频流。我只需要以某种方式收集结局? 我可以为每个事件调用一个函数调用并对其进行计数……虽然听起来很hacky? 我觉得有办法兑现诺言,但我不知道怎么做。 问题答

  • 本文向大家介绍如何解决异步回调地狱?相关面试题,主要包含被问及如何解决异步回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 问题内容: 在下面的代码中,我是否处于回调状态?如何在不使用纯JavaScript的异步模块的情况下克服这种情况? 上面的代码被复制到多个位置以使代码按预期工作。 问题答案: 是的,您处于回调地狱。假设您不想使用异步的解决方案(我怀疑您可以证明除偏见之外的其他理由)包括: 1 )进行更多顶级功能。根据经验,每个功能应执行1或2个IO操作。 2 )调用这些函数,使您的代码遵循由一小部分控制流“胶水”

  • 问题内容: 我正在使用以下代码通过AJAX提交表单: 背景 我的PHP处理程序执行各种任务,然后发回响应。然后,我可以在成功或错误函数中执行某些操作。 我的问题 当用户双击表单的“提交”按钮时,将发生两次AJAX调用,这将导致我的PHP处理程序中的代码执行两次。 我的问题 如果用户双击提交,如何避免我的代码执行两次? 问题答案: 当AJAX调用再次出现时,请先禁用首次单击的“提交”按钮,然后重新启