首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6 - Promise.all在Promise.resolve中

ES6 - Promise.all在Promise.resolve中
EN

Stack Overflow用户
提问于 2015-12-12 22:49:48
回答 1查看 259关注 0票数 3

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

这是我的密码:

代码语言:javascript
复制
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()时,它实际上是返回了一个新的承诺

下面是send.successsend.failure函数的样子:

代码语言:javascript
复制
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
      });
    };
  }
}

下面是我试图让我的函数执行的命令:

  1. updatePosition
  2. unLinkUserToPosition
  3. linkUserToPosition
  4. getPositionAndCommittees -这个函数用getPositiongetCommittees调用Promise.all,并在getPosition()和getCommittees()完成执行并返回格式化的JSON数据后立即调用formatJSON
  5. send.success -这只是输出应该从formatJSON返回的JSON

它现在执行的方式是,从linkUserToPosition返回的数据作为send.success函数中的数据返回,这意味着Promise.resolve没有等待getPositionAndCommittees完成Promise.all的执行。

以下是输出的样子:

代码语言:javascript
复制
{
  "fieldCount": 0,
  "affectedRows": 1,
  "insertId": 0,
  "serverStatus": 2,
  "warningCount": 0,
  "message": "(Rows matched: 1  Changed: 0  Warnings: 0",
  "protocol41": true,
  "changedRows": 0
}

任何关于我如何完成我正在努力做的事情的建议都会受到极大的感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-12 23:42:51

我认为问题是几个函数是立即启动的,而不仅仅是在前面的步骤完成之后。

假设这个呼叫链:

代码语言:javascript
复制
updatePosition(organizationId, positionId, positionTitle)
.then(unLinkUserToPosition(positionId))
.then(linkUserToPosition(positionId, positionUserId))
.then(getPositionAndCommittees(positionId))
.then(send.success(res))
.catch(send.failure(res));

这意味着异步函数updatePositionunLinkUserToPositionlinkUserToPositiongetPositionAndCommittees都将立即启动。send函数也是如此,但是由于这些函数返回一个稍后将执行的函数,所以没有问题。这意味着函数立即执行,得到的承诺被分配给前一个函数的.then() --这是没有意义的,因为然后接受一个函数(可能会返回一个承诺),而不是一个承诺。你需要的是:

代码语言:javascript
复制
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));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34245925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档