Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6-允诺。一切在允诺之内。决心_Javascript_Node.js_Promise_Ecmascript 6_Es6 Promise - Fatal编程技术网

Javascript ES6-允诺。一切在允诺之内。决心

Javascript ES6-允诺。一切在允诺之内。决心,javascript,node.js,promise,ecmascript-6,es6-promise,Javascript,Node.js,Promise,Ecmascript 6,Es6 Promise,我正在使用ecmascript 6并试图在我的API中一起执行Promise.resolve()中的Promise.all() 这是我的密码: import jwt from "jsonwebtoken"; import Database from "../../../util/Database"; import send from "../../../util/send"; var updatePosition = function(organizationId, positionId, p

我正在使用
ecmascript 6
并试图在我的API中一起执行
Promise.resolve()
中的
Promise.all()

这是我的密码:

import jwt from "jsonwebtoken";
import Database from "../../../util/Database";
import send from "../../../util/send";

var updatePosition = function(organizationId, positionId, positionTitle) {
  let updatedPosition = {
    organization_id: organizationId,
    title: positionTitle
  };
  return Database.connection.query('UPDATE positions SET ? WHERE id=?', [updatedPosition, positionId]);
}

var unLinkUserToPosition = function(positionId) {
  return Database.connection.query('UPDATE users SET position_id=NULL WHERE position_id=?', positionId);
}

var linkUserToPosition = function(positionId, userId) {
  return Database.connection.query('UPDATE users SET position_id=? WHERE id=?', [positionId, userId]);
}

var getPositionAndCommittees = function(positionId) {
  return Promise.all([getPosition(positionId), getCommittees(positionId)]).then(formatJSON);
}

var getPosition = function(positionId) {
  return Database.connection.query('SELECT \
    p.id as position_id, \
    p.title as position_title, \
    u.id as user_id, \
    u.facebook_UID, \
    u.email, \
    u.first_name, \
    u.last_name, \
    u.phone, \
    u.semester_joined, \
    u.year_joined, \
    u.thumbnail_photo_URL, \
    u.cover_photo_URL \
    FROM positions p \
    LEFT JOIN users u ON p.id=u.position_id \
    WHERE p.id=? \
    ORDER BY p.id ASC', positionId);
}

var getCommittees = function(positionId) {
  return Database.connection.query('SELECT \
    c.id as committee_id, \
    c.title as committee_title, \
    u.id as chairmen_user_id, \
    u.thumbnail_photo_URL as chairmen_thumbnail_photo_URL, \
    u.first_name as chairmen_user_first_name, \
    u.last_name as chairmen_user_last_name \
    FROM committees c \
    LEFT JOIN users u ON c.chairmen_id=u.id \
    WHERE c.position_id=? ORDER BY c.title ASC', positionId);
}

var formatJSON = function(results) {
  let positionResult = results[0][0];
  let committeesResult = results[1];
  let position = {
    id: positionResult.position_id,
    title: positionResult.position_title,
    user: {
      id: positionResult.user_id,
      facebookUID: positionResult.facebook_UID,
      email: positionResult.email,
      firstName: positionResult.first_name,
      lastName: positionResult.last_name,
      phone: positionResult.phone,
      semesterJoined: positionResult.semester_joined,
      yearJoined: positionResult.year_joined,
      thumbnailPhotoURL: positionResult.thumbnail_photo_URL,
      coverphotoURL: positionResult.cover_photo_URL
    },
    committees: committeesResult
  };

  return position;
}

module.exports = function(req, res) {
  let token = req.headers['bearer-authorization'];
  let tokenSecret = ENV.API_SECRET
  let decodedToken = jwt.verify(token, tokenSecret);

  let organizationId = 1
  let positionId = req.params.positionId;
  let positionTitle = req.body.title;
  let positionUserId = req.body.userId;

  Promise.resolve(updatePosition(organizationId, positionId, positionTitle))
    .then(unLinkUserToPosition(positionId))
    .then(linkUserToPosition(positionId, positionUserId))
    .then(getPositionAndCommittees(positionId))
    .then(send.success(res))
    .catch(send.failure(res));
};

旁注:我在数据库查询中使用了
promise-mysql
,这意味着当我返回
database.connection.query()
,它实际上返回了一个新的promise


以下是
send.success
send.failure
函数的外观:

var send = {
  success: function(response) {
    return function(data) {
      response.status(200).json(data);
    };
  },
  failure: function(response) {
    return function(error) {
      var statusCode = error.statusCode || 500;

      if (statusCode === TEMPORARY_REDIRECT && error.body && error.body.value) {
          response.status(200).json(error.body.value);
          return;
      }

      console.error(error.stack);

      response.status(statusCode).json({
        message: error.message
      });
    };
  }
}

以下是我试图让函数执行的顺序:

  • 更新位置
  • 取消链接用户位置
  • 链接用户位置
  • getPositionAndCommittees-此函数使用
    getPosition
    getCommittees
    调用Promise.all,并应在getPosition()和getCommittees()完成执行并返回格式化JSON数据后立即调用formatJSON
  • send.success-这只是输出应从formatJSON返回的JSON
  • 它现在执行的方式是,从
    linkUserToPosition
    返回的数据将作为
    send.success
    函数中的数据返回,这意味着
    Promise.resolve
    不会等待
    getPositionAndCommittees
    完成执行
    Promise.all

    以下是输出结果:

    {
      "fieldCount": 0,
      "affectedRows": 1,
      "insertId": 0,
      "serverStatus": 2,
      "warningCount": 0,
      "message": "(Rows matched: 1  Changed: 0  Warnings: 0",
      "protocol41": true,
      "changedRows": 0
    }
    

    任何关于我如何完成我正在尝试做的事情的建议都将不胜感激

    我认为问题在于几个功能会立即启动,而不仅仅是在前面的步骤完成之后

    假设此呼叫链:

    updatePosition(organizationId, positionId, positionTitle)
    .then(unLinkUserToPosition(positionId))
    .then(linkUserToPosition(positionId, positionUserId))
    .then(getPositionAndCommittees(positionId))
    .then(send.success(res))
    .catch(send.failure(res));
    
    这意味着异步函数
    updatePosition
    unLinkUserToPosition
    linkUserToPosition
    getPositionAndCommittees
    都将立即启动。send函数也是,但是由于这些函数返回一个稍后将执行的函数,所以没有问题。这意味着函数立即执行,结果承诺被分配给上一个函数的
    .then()
    ,这没有意义,因为它接受一个函数(可能返回承诺),而不是承诺。您需要的是:

    updatePosition(organizationId, positionId, positionTitle)
    .then(updatePositionResult => unLinkUserToPosition(positionId))
    .then(unLinkUserToPositionResult => linkUserToPosition(positionId, positionUserId))
    .then(linkUserToPositionResult => getPositionAndCommittees(positionId))
    .then(send.success(res))
    .catch(send.failure(res));
    

    旁注:我认为你的
    承诺。解析
    功能是多余的。当您为它分配一个承诺(promise that.catch返回的承诺)时,它不会立即得到解决,它也会返回一个承诺。你实际上忽略了承诺,所以你不需要它。您只需使用
    updatePosition(…)
    @Matthias247启动异步操作,谢谢您的提示!我将其更新为以
    updatePosition()
    开头。在getPositionAndCommittees promise完成后调用send.success函数仍然没有成功,因为调用的是JSON格式吗?根据对删除答案的讨论,我认为您的代码看起来不错。我的最后一个想法是:Database.connection.query()返回什么?它是一个普通的javascript对象吗?或者可能是某种游标,其实例被DB库重用?在这种情况下,您可能需要在每个步骤之后将查询结果克隆到一个普通的JSON对象中。DB真的支持并发查询吗?啊,现在我知道了。威尔发布解决方案我甚至不知道我能做到!我得查一下它的功能,但你已经成功了!非常感谢:)看。