JS中的不良承诺

时间:2018-05-03 12:47:25

标签: node.js express

我有一个位于/models/profile.js中的函数:

module.exports = {
    getDataProfil : function(id_user){
        connection.query("SELECT * FROM user WHERE id_user = ?", [id_user], function(err, rows, fields){
            if(err) throw err;
            console.log(rows[0]);

        });
    }
}

我想调用/controllers/profile.js中的getDataProfile

module.exports.profil_get = function(req, res, next) {
    profile_model.getDataProfil(req.user.id_user).then();


}

我想在那里实现承诺,因为我需要渲染页面。怎么做?三江源

3 个答案:

答案 0 :(得分:2)

使用此功能,您也可以使用q模块。

module.exports = {
  getDataProfil: function(id_user) {
    connection.query("SELECT * FROM user WHERE id_user = ?", [id_user], function(err, rows, fields) {
      if (err) return ['err', err];
      return [null, rows[0]];
    });
  }
}

profil_get将是:

module.exports.profil_get = function(req, res, next) {
  profile_model.getDataProfil(req.user.id_user)
    .then(function(res) {
      console.log(res);
    });
}

检查res[0]null是否成功,或者是拒绝的字符串。

另一个实现是

module.exports = {
  getDataProfil: function(id_user) {
    var dfd = q.defer();
    connection.query("SELECT * FROM user WHERE id_user = ?", [id_user], function(err, rows, fields) {
      if (err) { dfd.reject(err); }
      else { dfd.resolve(rows[0]); }
    });
  }
  return dfd.promise;
}

profil_get

module.exports.profil_get = function(req, res, next) {
  profile_model.getDataProfil(req.user.id_user)
    .then(function(res) {
      console.log(res);
    })
    .catch(function(err){
       console.log(err);
     });
}

答案 1 :(得分:1)

使用原生承诺:

module.exports = {
  getDataProfile : function ( id_user ) {
    return new Promise( ( resolve, reject ) => {
      connection.query( 'SELECT * FROM user WHERE id_user = ?', [ id_user ], function ( err, rows, fields ) {
        if ( err ) {
          return reject( err );
        }
        return resolve( rows[ 0 ] );
      } );
    } );
  }
};

然后,您可以调用您的承诺并处理响应/错误案例。理想情况下,您会回复客户而不是使用console.log/error

module.exports.profile_get = function(req, res, next) {
  profile_model.getDataProfile(req.user.id_user).then( response => {
    console.log( response );
  }).catch( err => {
    console.error( err );
  });
};

答案 2 :(得分:0)

只需使用原生的Promise构造函数:

module.exports = {
    getDataProfil : function(id_user) {
      return new Promise(function (resolve, reject) {
        connection.query("SELECT * FROM user WHERE id_user = ?", [id_user], function (err, rows, fields) {
            if (err) return reject(err);
            return resolve(rows[0]);
        });
      })
    }
}