在猫鼬中创建承诺时,不会调用执行器

Executor doesn't get called when a Promise is created in Mongoose

本文关键字:调用 执行 创建 承诺      更新时间:2023-09-26

3月9日更新

我使用内置的 ES6 承诺,它可以工作:

mongoose.Promise = Promise;

由于我确定猫鼬的版本是 4.4.6,事实证明猫鼬承诺(mpromise)有问题。真是奇怪。


我已经在 jsbin 中尝试过,它表明传递给 Promise 构造函数的函数将在构造 Promise 对象之前被调用,但是在 Mongoose 中使用 Promise 时,该函数不会被调用。

测试代码在这里:

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var Promise = mongoose.Promise;
// Test
router.post('/promise', function (req, res, next) {
    var promise = new Promise(function (re, rej) {
        console.log('start');
        setTimeout(function () {
            console.log('stop');
            re('RESULT');
        }, 4000);
    });
    promise.then(function (result) {
        console.log(result);
    });
});
module.exports = router;

控制台中不打印任何内容。猫鼬版"mongoose": "^4.4.4" .

猫鼬

的承诺和内置Promise之间的区别在于,ES6 的不是猫鼬的,而是可更新的

猫鼬文档引用了"thenability"功能,但没有提到任何解析/拒绝过程(无论是 promiseaplus 的文档),所以你的代码中预计不会发生任何事情。

如下所示的解决方案应该可以完成您的任务:

var router =  require('express').Router();
var mongoose = require('mongoose');
// Test
router.post('/promise', function (req, res, next) {
  var es6_promise = new Promise(function (resolve, reject) {
    console.log('start');
    setTimeout(function() {
          console.log('stop');
          resolve('RESULT');
        }, 4000);
    });
  es6_promise.then(function (result) {
    console.log(result);
  });
});
module.exports = router;