Sails JS - 嵌套.query方法不运行序列

时间:2017-12-19 14:47:23

标签: javascript node.js postgresql sails.js sails-postgresql

我是Sails JS的初学者。我尝试制作多个.query(“SELECT ...”)。看起来它没有运行序列我有一个问题。我将解释我的问题,请查看我的代码段:

var isSuccess = true;
for(var loc = 0 ; loc < decode.length ; loc++){
    Location.query('SELECT * FROM abc', function (err, res){
      if (err) {
        isSuccess = false;
        return res.json(200, {
          data: {

          },
          status: {
            id: 0,
            message: err.message
          }
        });
      } else {
        var validate = res.rows;
        sails.log(validate);

      secondQuery.query('SELECT * FROM def', function (err, seconResult) {
        if (err) {
          isSuccess = false;
          sails.log("Update is Success : "+isSuccess);
          return res.json(200, {
            data: {

            },
            status: {
              id: 0,
              message: err.message
            }
          });
        } else {


        }
      });
      }
    });

    if(isSuccess){
      return res.json(200, {
        data: {

        },
        status: {
          id: 1,
          message: "Successful",
          isSuccess: isSuccess
        }
      });
    }
  }

当我通过POST方法请求API时,结果是:

在控制台节点JS服务器上:

更新成功:false 所以这意味着请求失败,并且邮递员必须返回状态= 0

但在邮递员中,它显示:

  data: {

        },
        status: {
          id: 1,
          message: "Successful",
          isSuccess: true
        }

我的问题:

任何人都可以帮我解释为什么以及如何使它成为一个序列过程,而不是像“多线程”? (在我的情况下,我需要使用RAW查询,因为我将面对非常复杂的查询)

谢谢。

1 个答案:

答案 0 :(得分:1)

for循环是同步的,而Location.query()方法则不是。 因此,如果您想按顺序执行此操作,则必须使用Bluebird Promise

示例(未测试):

const Bluebird = require('bluebird');

const promises = [];
for(let loc = 0 ; loc < decode.length ; loc++) {
  promises.push(Location.query('SELECT ...'));
}

Bluebird.each(promises, (result) => res.json(200, {/* your payload data */}))
        .catch((err) => res.json(200, {/* your error data */}));

注意:在Sails控制器中使用{/ 1}}变量时,请小心使用res变量。