Uncaught (в обещании): как ожидать функцию, которая возвращает обещание внутри al oop? - PullRequest
0 голосов
/ 07 марта 2020

Я работаю над ожиданием функции, которая возвращает обещание внутри al oop. Но я не смог ее решить.

l oop равно

for (var i = 0; i < rows.length; i++) {
    console.log("row " + i);
    getData(i).then(function (data) {            
        console.log("data of row "+ i +" is "+ data);
    });
}

Вывод:

row 0
row 1
row 2
data of row undefined data
data of row undefined data
data of row undefined data

Я пытался поставить l oop в Async Context и ожидают для функции getData, но она вызывает deadlock с ошибкой Uncaught (in promise) undefined при row 0, как показано ниже:

getRows().then(async function (rows) {
    for (var i = 0; i < rows.length; i++) {
        console.log("row " + i);
        await getData(i).then(function (data) {            
            console.log("data of row "+ i +" is "+ data);
        });
    }
});

Стоит скажем, я определил promise reject function так: reject(undefined) но я пробовал reject(false) и reject(null) также. Тем не менее, нет разницы и Uncaught (in promise) исключений и deadlock.

function getData(row) {
    var promise = new Promise(function (resolve, reject) {
        whenAvailable("read", function (t) {
            read("data", row, 0, 1, true, "so").then(function (data) {
                if (data != undefined) {
                    resolve(data);
                } else {                   
                    reject(false);
                }
            });
        });
    });
    return promise;
}

, а также я проверяю другие stackoverflow связанные вопросы, но они не подходят для моей проблемы.

Можете ли вы помочь мне преодолеть эту проблему?

Обновить

Я сделал ниже, как @ SunilLama сказал

getRows().then(async function (rows) {
if (rows != undefined) {
    for (var i = 0; i < rows.length; i++) {
        console.log("rows " + i);
        await getData(i).then(function (data) {
            console.log(data);
        }, error => console.log(error));
    }
}

снова deadlock за исключением

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

, оборачивая l oop в функцию async, должен это сделать:

function getData(i) {
  var promise=  new Promise((resolve, reject) => {
    setTimeout(function() {
      resolve(i+1);
    },1000);
  });
  return promise;
}
var main = async() => {
  for (var i = 0; i < 10; i++) {
    console.log("row " + i);
    await getData(i).then(function(data) {
      console.log("data of row " + i + " is " + data);
    },error=> console.log(error));
  }
}

main();
0 голосов
/ 07 марта 2020

Если вы считаете, что каждая итерация должна ждать предыдущую, то один из способов - сделать это с рекурсией.

var rows = ["a","b","c"];
function getData(i) {
  var promise=  new Promise((resolve, reject) => {
    setTimeout(function() {
      resolve(rows[i]);
    },1000);
  });
  return promise;
}
function recur(i) {
    i = i || 0; // For first time, makes it zero
    if (i >= rows.length) { return; } // Stop if it's out of range
    console.log("row " + i);
    getData(i).then(function (data) {            
        console.log("data of row "+ i +" is "+ data);
        recur(i + 1); // Call for next iteration
    });
}
recur(); // Call
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...