Sails JS - 嵌套的 .query 方法没有 运行 序列

Sails JS - Nested .query method doesn't run sequence

我是 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 所以表示请求失败,必须是return status = 0 in postman

但是在 Postman 中,它显示:

  data: {

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

我的问题:

任何人都可以帮我解释为什么以及如何使它成为一个序列过程,而不是像 "multi thread"? (就我而言,我需要使用 RAW 查询,因为我将面临非常复杂的查询)

谢谢。

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 控制器中使用 res 变量时要小心。