- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以向我解释一下为什么以下两个链式函数:
// returns zero if okay
var resetCounter = function (model) {
return new Promise(function (resolve, reject) {
model.resetCount(function (error, result) {
if (error) {
console.log(error);
reject(error);
} else {
console.log(result);
resolve(result);
}
});
});
};
// returns the amount of deleted entries
var clearCollection = function (collection) {
collection.remove({}, function (error, result) {
if (error) {
console.log(error);
return Promise.reject(error);
} else {
console.log(result);
return Promise.resolve(result);
}
});
};
// chaining for demo purposes
var reset = function () {
return resetCounter(nm)
.then(console.log('1 -> After newsmodel'))
.then(resetCounter(sm))
.then(console.log('2 -> After schoolmodel'))
.then(resetCounter(um))
.then(console.log('3 -> After usermodel'))
.then(clearCollection(nm))
.then(console.log('4 -> After clearing all news'))
.then(clearCollection(sm))
.then(console.log('5 -> After clearing all schools'))
.then(clearCollection(um))
.then(console.log('6 -> After clearing all users'))
.catch(function (error) {
console.log(error);
});
};
产生以下输出:
1 -> After newsmodel
2 -> After schoolmodel
3 -> After usermodel
4 -> After clearing all news
5 -> After clearing all schools
6 -> After clearing all users
7 -> After inserting news
8 -> After inserting schools
9 -> After inserting users
0
0
0
30
500
100
在本例中我省略了一个插入函数。在清除所有内容后,它再次填充数据库...
我的预期结果是:
0
1 -> After newsmodel
0
2 -> After schoolmodel
0
3 -> After usermodel
500
4 -> After clearing all news
100
5 -> After clearing all schools
30
6 -> After clearing all users
7 -> After inserting news
8 -> After inserting schools
9 -> After inserting users
只是为了清理它!在这种情况下,我对 promise 的结果不感兴趣。我只对异步操作的执行顺序感兴趣。这就是为什么我没有将任何 successback 或 errback 传递给 .then()。我尝试用“何时”替换“Bluebird ”,但没有成功,这清楚地告诉我,我错过了关于一般 promise 的重要信息。我遇到的大多数例子都是在下面的 .then() 中使用 Promise 的结果,在这种情况下我又不感兴趣。
我做错了什么?
最佳答案
I am only interested in the execution order of the async operations. That is why I'm not passing any successback or errback to the .then(). Most examples I came around are using the result of the promise in the following .then(), which again, in this case I'm not interested in.
您不必必须使用结果参数,但您始终需要传递一个回调函数,以便 Promise 稍后执行。
I'm missing something crucial about promises in general
Promise 确实代表操作的结果,而不是操作本身。这意味着当你做出 promise 时,任务就已经开始了。您需要使用一个可以执行然后返回 promise 的函数。
What am I doing wrong?
.then()
方法确实期望这样一个函数 - 当 promise 的结果(无论它是什么)到达时调用。该函数不需要使用该结果,但它必须可调用。
就您而言,您正在传递以下内容:
console.log(…)
- 立即记录参数并传递 undefined
resetCounter(um))
- 立即调用异步函数并将 Promise 传递给 then
,在此处它被忽略(因为它不是函数)clearCollection(nm)
- 立即调用异步函数,但 clearCollection
不返回任何内容,因此我们返回 undefined
。<例如,
// returns the amount of deleted entries
var clearCollection = function (collection) {
collection.remove({}, …);
};
实际上并没有返回
任何东西。您使用 return
的唯一部分是回调内部,它没有任何意义。您需要构造一个类似于您的 resetCounter
函数的 Promise
- 或者您只需使用 Promisification feature :
function clearCollection(collection) {
return Promise.promisify(collection.remove, collection)({});
}
现在,您的链应该如下所示:
resetCounter(nm)
.then(function() {
console.log('1 -> After newsmodel');
return resetCounter(sm);
})
.then(function() {
console.log('2 -> After schoolmodel');
return resetCounter(um);
})
.then(function() {
console.log('3 -> After usermodel');
return clearCollection(nm);
})
.then(function() {
console.log('4 -> After clearing all news');
return clearCollection(sm);
})
.then(function() {
console.log('5 -> After clearing all schools');
return clearCollection(um);
})
.then(function() {
console.log('6 -> After clearing all users');
}, function (error) {
console.log(error);
});
关于javascript - 链式 bluebird .then() 的奇怪执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26180606/
bluebird.js和bluebird.core.js有什么区别? 什么时候应该使用bluebird.core.js而不是bluebird.js? 我无法在bluebird site或其他地方找到任
我正在从异步转换为 Bluebird,但不知道如何打破循环 这是我想要实现的目标: 循环数据数组。 对于每个项目,检查它是否存在于数据库中。 将一个项添加到数据库(第一个不存在的项),然后退出.eac
我试图用 .try(function(){}).catch(function(){}) 块返回一个 promise 。我的问题是由我的 promise 类型引起的。 deleteProcess
我正在尝试使用 bluebird 的 .return() 来扩展 promise 解析值方法。 目前我正在使用以下代码: doSomethingAsync() // assu
我刚刚开始使用 Promise 和 Bluebird。调试时我可以看到我的函数执行了两次: 首先我收到此错误:TypeError:未捕获错误:无法读取未定义的属性“then” 然后我看到函数再次执行,
我想测试数组的每个元素,直到满足条件,然后跳过其余的。这是我想出的代码,它似乎有效,但我不确定它是否真的安全或有意想不到的副作用。欢迎其他解决方案。 let buddyAdded = false; r
假设我有以下 node.js 代码 function foo() { return promiseOne().then(function(result) { return pr
假设我想在从数据库查找用户后同时发送电子邮件并向客户端推送通知,我可以这样写 User.findById(userId).exec() .then(() => sendMail()) .then(()
.call 方法的 Bluebird 文档有 code sample标记为“链接破折号或下划线方法”。 下面的代码片段中链接的 .then(_) 的用途是什么? var Promise = requi
是否有某种方法可以检索从上一个 then 回调返回的任何内容(或传递给初始 Promise.resolve()/resolve())? const p = Bluebird.resolve().the
我有以下代码。当 f2 没有抛出错误时,它工作正常。 如果有错误,它会生成一个Unhandled rejection Error。 重写代码以避免 Unhandled rejection Error
我有一个来自这篇文章的后续问题:Chaining Requests using BlueBird/ Request-Promise 我对 promise 很陌生,所以请原谅我的天真。我成功地实现了这段
我是 Bluebird 的新手,我正在尝试创建一个新用户,但 reject 函数没有按预期工作。 问题是它为我创建了用户,即使它启动了错误There nickname is already in us
我正在尝试实现剪刀石头布游戏的 CLI 版本。我正在使用查询器模块来处理 IO。我的主要功能如下所示: RockPaperScissors.prototype.gameLoop = function(
此代码运行正常: let promise; try { promise = parent(); //but I want: await parent(); await cont
在 promise 了 fs-extra 后,我知道我可以使用 then 来访问文件。我猜想有某种机制,在获取文件后,它知道要移动到 then 链中的下一个链接。然而,接下来的then我只是放置了一个
我有以下代码。它按预期工作,没有抛出未处理的拒绝错误。 p = new Promise (fulfill, reject) -> reject new Error 'some error' p.c
我期待 Bluebird forgotten return warning出现,但由于某种原因它不起作用。 A demo : const Bluebird = require('bluebird');
我正在使用 bluebird图书馆结束memcached . memcached.set('foo', 'bar', 10, function (err) { /* stuff */ }); 此函数不
我正在尝试如下使用 Bluebird 的协程: var p = require('bluebird'); //this should return a promise resolved to valu
我是一名优秀的程序员,十分优秀!