javascript - 在 NodeJS 中发送响应之前,如何确保 'for loop' 中的函数得到执行?

标签 javascript node.js promise

我为此使用 bluebird 。我需要获得这个函数,即 get_like_status(email, results[i].id) ,它在 for 循环的末尾执行,然后再发送标题。当我控制数组列表时,我得到它未定义。如果您能使用 bluebird 做到这一点,我将不胜感激,但我对任何其他 promise 包持开放态度。

var list = new Array();
  console.log(results.length);
  function get_like_status(email, project_id){
    connection.query("SELECT email FROM likes WHERE liked_by='"+email+"' AND project_id='"+project_id+"';", function(err, results, fields){
      if(err){console.log(err); return(err)}else{
        if(results.length > 0){
          console.log("yes");
          return "yes";
        }else{
          console.log("yes");
          return "no";
        }
      }

    })
  }
  for(var i=0; i < results.length; i++){
    var empty = new Array();
    list.push(empty);
    list[i].push(results[i].email);
    list[i].push(results[i].project_name);
    list[i].push(results[i].project_description);
    list[i].push(results[i].header_image);
    list[i].push(results[i].id);
    list[i].push(get_like_status(email, results[i].id)); // This gets executed after the program has sent response!
  }
  Promise.all(list).then(function(){
    console.log(list);
    res.send(list); });

最佳答案

您必须重构您的代码才能真正等待 promise ,现在 list 数组只是一个具有不同值的常规数组,而不是等待解决的 promise 数组。

类似的东西

function get_like_status(email, project_id) {
    return new Promise(function( res, rej ) {
        var query = "SELECT email FROM likes WHERE liked_by='" + 
                    email + "' AND project_id='" + project_id + "';"

        connection.query(query, function(err, results, fields) {
            if (err) {
                rej(err);
            } else {
                res( results.length > 0 ? "yes" : "no" );
            }
        });
    });
}

var promises = [];
var list = results.map(function(item, index) {
    var arr = [
        item.email,
        item.project_name,
        item.project_description,
        item.header_image,
        item.id
    ]
    promises.push( 
        get_like_status(item.email, item.id).then(function(res) { 
            arr.push(res);
            return arr;
        }) 
    );
})

Promise.all( promises ).then(function() {
    res.send(list);
}).catch(function( err ) {
    res.send('epic fail!')
})

请注意,如果 connection.query 返回一个 promise,则无需将其包装在另一个 promise 中,只是不清楚 connection.query 来自哪里?

关于javascript - 在 NodeJS 中发送响应之前,如何确保 'for loop' 中的函数得到执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43033138/

相关文章:

javascript - 使用 ReduxReducer 修改嵌套状态

javascript - promise A+ 实现 : what to do when call then() and the promise is still pending?

javascript - Metalsmith 布局导致 "no files to process"错误

javascript - 在 fancytree 插件上选择/取消选择具有相同 ID 的所有节点

javascript - NodeJS - 在 OSX 上将 Winston 登录到系统日志

c# - 使用Unity-socketio-websocketsharp从Unity向nodejs发出的jsonmessage无法解析

node.js - 使用 npm-check-updates 更新时未找到 Package.json 错误

node.js - 如何在后端的nodejs中进行排序

javascript - 带有传递参数的 Angular Promise 链接

promise - 为什么需要调用resolve()?