【问题标题】:JavaScript promise not resolving [duplicate]JavaScript 承诺无法解决 [重复]
【发布时间】:2019-05-09 16:31:35
【问题描述】:

我无法让它发挥作用,并开始认为我误解了一些基本的东西。我经历了很多例子,我看不出我做错了什么。

这是我的承诺:

myPromise = new Promise ( resolve => {
  if (matchNew(id)) resolve();
})

myPromise.then( () => {
  console.log('resolved');
})

matchNew() 是一个在完成保存到数据库后简单地返回“true”的函数。我的控制台确认发生了这种“真实”返回,但代码没有等待它,并且上面的承诺永远不会解决。

更新

这就是我所说的 MatchNew() 的目的:它等待 MongoDB 确认写入成功,然后返回 true。

function matchNew(id) {

  /* do some stuff */

  // update database
  MongoPath.Match
    .replaceOne( {'_id': m._id}, thisMatch, {writeConcern: { j: true}})
    .then( (msg) => {
      console.log(msg);
      return true;
     });
  }

我想确保我的主代码正在等待,直到我从 matchNew 获得返回值,然后再继续...

【问题讨论】:

  • resolve() 移动到matchNew 完成操作后调用的回调中。
  • "matchNew() 是一个在完成保存到数据库后简单地返回 'true' 的函数。" - 一个函数不能异步 return。它的实际作用是什么?

标签: javascript node.js mongodb promise


【解决方案1】:

matchNew() 是一个在完成保存到数据库后简单地返回“true”的函数。

那是不可能的。它要么立即返回true,要么返回一个Promise,在完成时解析为true。因此:

 if (matchNew(id))

是一样的:

 if (new Promise())

这将直接进入分支,因为对象在 javascript 中是真实的。相反,您只想链接承诺:

 matchNew(id).then(matches => {
    if(matches) {
      /*...*/
    } else {
      /*...*/
    }
});

【讨论】:

  • 更新了我的帖子以阐明 matchNew() 函数的用途。您会看到,我确实在尝试在完成保存到数据库后“返回 'true'”,但这显然没有达到我的预期......
  • @kissenger return来自matchNew的承诺。
  • 我修好了,但我不能回答我自己的问题,所以我不能分享。遗憾。感谢您为我指明了正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2017-12-29
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多