Обратный вызов "resolve" выполняется до завершения для l oop, и поэтому передается пустой массив. Синтаксис неправильный или есть другой способ? - PullRequest
1 голос
/ 14 июля 2020

Для l oop сначала должна завершиться sh, а затем должна выполняться функция разрешения.

let promise = new Promise(function(resolve, reject) {
  arr = [];
  for (let i = 0; i < req.body.length; i++) {
    Customer.find({
      '_id': req.body[i]
    }).then(documents => {
      console.log("name", documents[0].name);
      arr.push(documents[0])
    });
  }
  resolve(arr);
});

promise.then(
  result => {
    console.log(result);
  }
)

1 Ответ

0 голосов
/ 14 июля 2020

Ваш метод Custom.find - asynchronous, поэтому, пока ваша функция asynchronous работает для возврата promise, остальная часть вашей функции вне функции работает как обычно, поэтому вы получаете пустой массив, код выполняется до того, как ваша функция asyn c завершится внутри l oop, чтобы получить массив со значениями за пределами l oop, чтобы ваше обещание возвращало значение, к которому вы можете получить доступ позже за пределами loop

let promise = new Promise(function(resolve, reject) {
  arr = [];
  for (let i = 0; i < req.body.length; i++) {
    var finalvalue=Customer.find({
      '_id': req.body[i]
    }).then(documents => {
      console.log("name", documents[0].name);
      arr.push(documents[0])
      return arr
    });
  }
  resolve(finalvalue)
});

promise.then(
  result => {
    console.log(result);
  }
) 

вот рабочий пример

cutosm=(i)=>new Promise(r=>{
  setTimeout(()=>{
      r(i)
  },300 +Math.random()*200)
})
async function smfunc(){
  arr = [];
  for (let i = 0; i < 8; i++) {
   var finalvalue= await cutosm(i).then(e => {
      arr.push(e)
      return arr
    });
  }

  return finalvalue

}
smfunc().then(r=>console.log(r))
...