- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 ecmascript 6
并尝试在 Promise.resolve()
中一起执行 Promise.all()
我的 API。
这是我的代码:
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
});
};
}
}
这是我试图让我的函数执行的顺序:
getPosition
和 getCommittees
调用 Promise.all 并且应该在 getPosition() 和 getCommittees() 完成执行并返回格式化的 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
都将立即启动。发送功能也是如此,但由于它们返回一个稍后将执行的功能,所以没问题。这意味着函数立即执行,并将生成的 promise 分配给前一个函数的 .then()
- 这没有意义,因为 then 接受一个函数(可能返回一个 promise),而不是一个 promise .你需要的是:
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));
关于javascript - ES6 - Promise.all 在 Promise.resolve 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34245925/
我使用 resolver() 作为 socket() 的替代方法,因为我发现当多个连接建立到不同的 IP 时,它最终会停止工作。 无论如何它会向我返回一个警告,我应该使用 dns.resolver.R
我有这个代码: var promise1 = new Promise(function(resolve, reject) { setTimeout(() => { console
我仍在学习 PHP,我认为我不是母语人士,这并不难理解。 此时,看了一大堆文档,跳入了深水区,于是打开Laravel源文件,一个接一个地看,试图更好地理解MVC的整个实现,包括路由、中间件如何组合成一
public JsonResult GetEvents(double start, double end) { var userName = Session["UserName"] as st
我正在使用 bluebird,我看到了两种将同步函数解析为 Promise 的方法,但我不明白这两种方法之间的区别。看起来堆栈跟踪有点不同,所以它们不仅仅是一个别名,对吧? 那么首选的方式是什么? 方
我写了下面的代码: function readFile(path) { return new Promise(function(resolve, reject){ if(!fs
我正在使用 bluebird,我看到了两种将同步函数解析为 Promise 的方法,但我不明白这两种方法之间的区别。看起来堆栈跟踪有点不同,所以它们不仅仅是一个别名,对吧? 那么首选的方式是什么? 方
在某处读过这个例子: return new Promise( (resolve, reject) => { fs.readFile(file, (err, data) => { if (e
我刚开始学习 React,我一直在尝试让我的 React 应用程序连接到我的数据库 var mysql = require('mysql'); var con = mysql.createConnec
我需要从 $http 调用中返回一个 promise 中的自定义响应,以便我可以链接更多调用。我有两个可用的实现。有人可以解释两者之间的区别,并争论其中一个更好吗? 在 fooService.js 实
免责声明:这里实际上提出了两个问题,但我觉得它们密切相关。 我正在尝试将 promise 对象传递给指令,并且我想在 promise 解析后立即在指令中运行一些初始化代码。 在我的 Controlle
我正在尝试创建类似于 this code 的东西在 boost.asio 示例中找到。 套接字.h: class some_class { private: ... boost
正如我们所知,Promise 构造函数采用一个执行函数,该函数具有两个参数,我们使用它们来生成成功案例或失败案例。今天我在编程,我被卡住了,但后来我解决了这个问题,但我发现了一件事需要理解。 有什么区
我认为 Promise.resolve 和 new Promise(resolve) 可以互换。 考虑一下: A. new RSVP.Promise(function (resolve, reject
我下载了一个 Java 项目,我想研究并从中学习一些东西。当我在另一台计算机上下载它时效果很好,但是当我在我的计算机上尝试时,几乎每个声明和导入都会给出错误消息“* cannot be resolve
我昨天看到了一些有趣的编译器行为,我想我明白为什么会这样,但我想确定一下。所以,我不会写我的推理,只写事实。 请注意,我使用 vector 而不是 string 并不是错字。我是故意这样做的,这样编译
我正在尝试运行 Ember 测试,它给出了这个错误,提示无法找到从 `AppName/resolver 导入的模块 ember-resolver。 我不确定是什么原因造成的。我正在使用 Ember-c
Code#1 和 Code#2 的区别在于:Code#1 使用 resolve(p) 而 Code#2 使用 p.then(()=>resolve()) 。我希望输出序列是不变的,但它们会生成不同的序
IntelliJ IDEA 无法解析内置 JVM 类型和方法的常见原因有哪些?例如,当我将鼠标悬停在 String 上时,工具提示显示“无法解析符号“String””。就好像 IntelliJ 不知道
IntelliJ IDEA 无法解析内置 JVM 类型和方法的常见原因有哪些?例如,当我将鼠标悬停在 String 上时,工具提示显示“无法解析符号“String””。就好像 IntelliJ 不知道
我是一名优秀的程序员,十分优秀!