0

我是 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 服务器上:

Update is Success : false 所以这意味着请求失败并且必须在邮递员中返回状态= 0

但在邮递员中,它显示:

  data: {

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

我的问题 :

谁能帮我解释为什么以及如何使它成为一个序列过程,而不是像“多线程”?(就我而言,我需要使用 RAW 查询,因为我将面临非常复杂的查询)

谢谢你。

4

1 回答 1

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 */}));

res注意:在 Sails 控制器中使用变量时,在回调中使用变量时要小心。

于 2018-01-15T11:00:20.150 回答