- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 objectId 列表,我想访问不同的集合并根据每个 Id 进行操作。我更喜欢一个接一个地执行操作(按顺序)
var removeOperation = function(objectified){
return Comps.findOne({reviews : objectified}).populate([{ path: "reviews", match : {_id : objectified}}])
}
var firstCheckIfAnonHasTheIdInReviewsArrayIfThereDeleteIt = function(objectified){
var query = {reviews : objectified};
var update = {$pull : {reviews : objectified}};
var option = {new :true};
return Anon.findOneAndUpdate(query, update, option );
};
var thenCheckIfUserHasTheIdInReviewsArrayIfThereDeleteIt = function(objectified){
var query = {reviews : objectified};
var update = {$pull : {reviews : objectified}};
var option = {new :true};
return User.findOneAndUpdate(query, update, option );
}
我正沿着这条路走:
Promise.mapSeries(arrOfObjectIds, function(e){
return removeOperation(e);
})
.then(function(results){
console.log(results);
var map = results.map(function(e){
// return e.reviews[0]
return e
})
console.log("map : ", map)
return Promise.resolve(map);
})
.then(function(compDocs){
console.log("compDocs: ",compDocs)
Promise.mapSeries(compDocs, function(compDoc){
return updateCompAndRemoveReviewFromArray(compDoc) // I know it's not show. It's another promise I use
})
}).then(function(returned){
return Reviews.remove({_id : {$in : arrOfObjectIds }})
})
.then(function(){
I wanted to do firstCheckIfAnonHasTheIdInReviewsArrayIfThereDeleteIt on the array of object Ids to delete the review from the array. Also if we succesfully removed the array here we should not have to go to the next user
promise which deletes a users review since if we deleted in Anon it won't be in User. since there is only one review ID possible per review.
})
.then(function(){
//if there was no review pulled from the Anon reviews Array. that means it's in the users review and we should do this promise
thenCheckIfUserHasTheIdInReviewsArrayIfThereDeleteIt()
})
也许你可以告诉我如何使用 mapSeries
在一组元素上,这样它就不会做出一个 promise ,而是做出多个 promise 。
我们可以做这样的事情吗:
Promise.mapSeries(arrOfObjectIds, function(e){
return removeOperation(e);
return firstCheckIfAnonHasTheIdInReviewsArrayIfThereDeleteIt(e)// extra credit: check if this was successful (review was pulled). If it wasn't got to next one.
return thenCheckIfUserHasTheIdInReviewsArrayIfThereDeleteIt(e)
})
最佳答案
用简化的术语重述问题:
<小时/>You have an array of IDs and for each ID in turn you want to call three promise-returning functions,
A
,B
andC
as follows :
A(id)
(unconditionally)- then
B(id)
(unconditionally)- then
C(id)
(conditionally, depending on the outcome ofB(id)
)
Can we do something like:
Promise.mapSeries(arrOfObjectIds, function(e){
return removeOperation(e);
return firstCheckIfAnonHasTheIdInReviewsArrayIfThereDeleteIt(e)// extra credit: check if this was successful (review was pulled). If it wasn't got to next one.
return thenCheckIfUserHasTheIdInReviewsArrayIfThereDeleteIt(e)
})
是的,尽管不太喜欢建议的代码。
首先,您需要对 B
报告其结果的方式进行设计选择。该问题暗示 B 的结果是“成功”与“失败”的情况,但这并不是建模的唯一方法。
选项 1:测试沿着 promise 链的成功路径传递的数据
编写B
,使其返回的 promise 将在成功(匿名评论被删除)或预期失败(匿名评论未删除)时实现,并报告通过参数的方式得出结果。
var B = function(objectified) {
var query = {reviews: objectified};
var update = {$pull: {reviews: objectified}};
var option = {new :true};
return Anon.findOneAndUpdate(query, update, option).exec();
};
然后你会写:
Promise.mapSeries(arrOfObjectIds, function(id) {
return A(id).then(function() {
return B(id);
}).then(function(item) { // item will be `null` if B(id) found nothing.
return item || C(id);
}).catch(function(error) {
// If anything went wrong, catch the error and log it.
console.log(error);
// By not re-throwing the error, the mapseries() is allowed to continue.
});
});
选项 2:沿着 promise 链的失败路径传递测试错误
编写B
,使其返回的 promise 将在成功时实现,或在预期失败时拒绝。
var B = function(objectified) {
var query = {reviews: objectified};
var update = {$pull: {reviews: objectified}};
var option = {new :true};
return Anon.findOneAndUpdate(query, update, option).exec().then(function(item) {
return item || Promise.reject(new Error('not found'));
});
};
然后你会写:
Promise.mapSeries(arrOfObjectIds, function(id) {
return A(id).then(function() {
return B(id).catch(function(error) {
// Here, you have to discriminate between the "expected error" and any unexpected errors.
if(error.message === 'not found') {
return C(id);
} else {
throw error; // unexpected error - rethrow it
}
});
}).catch(function(error) {
// If anything went wrong, catch the error and log it.
console.log(error);
// By not re-throwing the error, the overall mapseries() is allowed to continue.
});
});
在这两个选项中:
A
、B
和 C
中使用 .exec()
。 (据我了解 Mongoose,没有 exec()
你会得到一些有 .then()
方法的东西,但这不是一个成熟的 Promise)。catch()
。对我来说,选项 2 更符合逻辑,但我可能会选择选项 1,因为它更简单、更高效。
关于javascript - 对一组元素执行多个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204054/
如何从 promise 中退出 promise ? perl6 文档没有提供简单的方法。例如: my $x = start { loop { # loop forever until "qui
我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。 我有一个加入用户的友谊加入模型。一列是 friender
请帮我解释一下为什么日志结果有两种不同: 方式 1:每 1 秒顺序记录一次 方式 2:1 秒后记录所有元素。 // Way 1 let sequence = Promise.resolve(); [1
我的问题很简单。 Promise.all() 方法可以返回 Promise 吗?让我解释一下: function simpleFunction() { let queue = [];
我正在使用 Promise 从存储中读取文件并转换为 base64 字符串。我有图像数组,使用 RNFS 读取图像 const promise_Images = _Images.map(async (
如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise: console.log(Promise.all([1])); // prints
Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值? 如果不使用 await,它在我的上下文中不起作用 没有包装的例子: function sum1(x){ r
我一直在玩 promise,通常能想出如何处理好它们,但在这种情况下,我不知道如何删除一个 promise-wrapping level。 代码如下: let promise2 = promise1.
考虑以下嵌套的Promises结构: const getData = async() => { const refs = [{ name: "John33", age: 3
我已经阅读了 Promise/A+ 规范,但据我了解,还有诸如 Promise/A 和 Promise 之类的东西。它们之间有什么区别? Promise 和 Promise/A 规范也是如此吗?如果是
当我运行以下代码时: my $timer = Promise.in(2); my $after = $timer.then({ say "2 seconds are over!"; 'result'
以下简单的 promise 是发誓的,我不允许打破它。 my $my_promise = start { loop {} # or sleep x; 'promise re
我正在尝试扩展Promise: class PersistedPromise extends Promise { } 然后在派生类上调用静态resolve以直接创建一个已解决的Promise: Per
我有两个返回 promise 的函数,我独立使用它们作为: getLocal().then(...) 和 getWeb().then(...) 但是现在我遇到了一个奇怪的问题: 1) 我需要第三个
我不知道 promise.all 解决方案中的 promise.all 是否是一个好的实践。我不确定。 我需要从一组用户获取信息,然后通过此信息响应,我需要发送消息通知。 let userList =
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为: ([ 30 seconds wait. 4 ]promiseValue )then:
大家好,提前感谢您的帮助。 下面是我正在尝试做的事情 function1(){ throw some error(); } function2() { // dosomething suc
我有以下未解析的代码。f2 解决了,所以我不会添加该代码,它是 f1 我有问题。 我调用函数,它到达最里面如果,它调用函数“find”,它执行函数 findId,完美返回 Id,然后执行 editId
我是一名优秀的程序员,十分优秀!