数组 forEach 循环中的承诺

我有一个这样的数组:


var ids = [8372839402, 8392615782, 3677281302];

插入的是 id 值。基于这个 ID,我必须从数据库中为每个 ID 获取一些信息。基本上我通过使用位于 db.js 中的以下函数获取数据:


function getdata(get_command) {

  var request = new XMLHttpRequest();

  var params = params + 'command=' + encodeURIComponent(get_command) + '&';


  console.log(params);


  currentpromise = new Promise(function(resolve, reject) {

    request.open('POST', './php/get_data.php', true);

    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    request.onreadystatechange = function() {

      if (request.readyState === XMLHttpRequest.DONE) {

        if (request.status === 200) {

          var response = JSON.parse(request.response);

          resolve(response);

        }

        else {

          resolve({error: 'Cant connect!'});

        }

      }

    };

    request.send(params);

  });

}      

而不是在我的 main.js 中,我像这样使用这个函数:


var user_id = 'r82h9hfew89hf9983f8d9';

var currentpromise;

var obj = getdata('SELECT username, email FROM users WHERE id=' + user_id);

      currentpromise.then(function(obj) {

        if (obj.data[0] == 'false') {


        }

        else {

           //succesfully go on

        }

      });     

但是当我在数组中使用它时它不会工作。从那开始,我在 var currentpromise 上有多个承诺,或者每次在数组 forEach 中调用 getdata 函数来覆盖它们。

如何解决我的问题以无错误地循环遍历数组?


ids.forEach(function(id) {

    var obj = getdata('SELECT name FROM data WHERE id=' + id);

      currentpromise.then(function(obj) {

        if (obj.data[0] == 'false') {


        }

        else {

           //succesfully do next step

           var obj = getdata('SELECT version FROM vers WHERE name=' + obj.data[0]['name']);

           currentpromise.then(function(obj) {

             if (obj.data[0] == 'false') {


             }

             else {

               //succesfully finished with one id

             }

           });  

        }

      });  

});    

希望有人可以帮助我。提前致谢。


冉冉说
浏览 106回答 1
1回答

绝地无双

ForEach本质上是同步的,你不应该在forEach循环中使用 promises 或任何异步代码,因为它会简单地遍历数组而不等待 promise 得到实现。您可以改用for await...of循环。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript