Promise 未在递归调用的父函数中成功执行

Promise is not executing succesfully within a recursively called parent function

我有一个函数attemptSearch(),它首先被调用,然后它应该递归地调用自己直到满足某个条件。该代码目前仅部分起作用。每次迭代都会调用第二个 console.log(),但是函数 searchForPostcodes() 中的 console.log() 仅在 attemptSearch() 的初始调用期间被调用一次,这表明 [= searchForPostcodes() 代码中的 25=] 正在以下迭代中执行。不太确定我在这里做错了什么。

只是为了增加上下文,我已经确认 Postcode.find 方法单独运行良好。属于mongoDB->Mongoose Modal

的方法
let latMin = lat - 0.0005;
let latMax = lat + 0.0005;
let longMin = long - 0.0005;
let longMax = long + 0.0005;

const searchForPostcodes = new Promise((resolve, reject) => {
  console.log('test')
  Postcode.find({
    lat: {
      $gte: latMin,
      $lte: latMax
    },
    long: {
      $gte: longMin,
      $lte: longMax
    }
  }, (err, postcodes) => {
    if (err) {
      reject(err);
    } else {
      resolve(postcodes);
    }
  });
});
let searchAttempts = 0;

function attemptSearch() {
  latMin = latMin - 0.0005;
  latMax = latMax + 0.0005;
  longMin = longMin - 0.0005;
  longMax = longMax + 0.0005;

  searchForPostcodes
    .then(postcodes => {
      if (postcodes.length > 0) {
        res.json(postcodes);
      } else {
        if (searchAttempts < 100) {
          console.log(searchAttempts, latMin);
          searchAttempts++;
          attemptSearch();
        } else {
          res.status(400).send('No postcodes found');
        }
      }
    })
    .catch(err => {
      res.status(400).send(err);
    });
}
attemptSearch();

这里有多个问题。首先,在 attemptSearch() 内部,您必须 return 内部的承诺,以便将它们全部链接在一起。然后,您对 attemptSearch() 的额外调用实际上不会对 searchForPostcodes 做任何新的事情,因为这是一个静态承诺,而不是新生成的承诺。你不再调用你的数据库,你只是在使用之前的承诺。

因此,我实施了以下更改:

  1. 通过递归将searchForPostcodes改为每次都可以执行的函数。
  2. 切换到使用数据库中的本机承诺。
  3. return 添加到 return SearchForPostcodes().then().catch(),使其链接到相同的承诺链中。
  4. return 添加到 return attemptSearch() 以便递归调用链接到相同的承诺链中。

修改后的代码如下:

let latMin = lat - 0.0005;
let latMax = lat + 0.0005;
let longMin = long - 0.0005;
let longMax = long + 0.0005;

const searchForPostcodes = function() {
    return Postcode.find({
        lat: {
            $gte: latMin,
            $lte: latMax
        },
        long: {
            $gte: longMin,
            $lte: longMax
        }
    });
}

let searchAttempts = 0;

function attemptSearch() {
    latMin = latMin - 0.0005;
    latMax = latMax + 0.0005;
    longMin = longMin - 0.0005;
    longMax = longMax + 0.0005;

    return searchForPostcodes().then(postcodes => {
        if (postcodes.length > 0) {
            res.json(postcodes);
        } else {
            if (searchAttempts < 100) {
                console.log(searchAttempts, latMin);
                searchAttempts++;
                return attemptSearch();
            } else {
                res.status(400).send('No postcodes found');
            }
        }
    }).catch(err => {
        res.status(400).send(err);
    });
}
attemptSearch();

仅供参考,如果这是我的代码,我会将 latXX 变量作为函数参数传递给 searchForPostcodes(),而不是将它们设为更高范围的变量。