【发布时间】:2017-03-10 02:51:05
【问题描述】:
我保证,但我找不到任何可以处理我的场景的东西。
在我添加 pouch allDocs 调用之前,我使用了一组完美的 Promise 示例。
当我直接链接 allDocs 调用时,它工作正常。有人告诉我我可以在承诺中加入承诺,但事实并非如此。
我之所以按照我的方式设置它以及为什么使用 Promise.All() 会很困难,是因为我不希望所有的 Promise 一次执行。我希望一个承诺遵循另一个承诺。
我删除了所有内容,只显示了一个包含 PouchDB 调用 (allDocs) 的承诺。也许这无法做到。
这是我在其中包含 console.logs 的承诺,因此您可以看到路径。
我的承诺:
let cleanRoom = function () {
return new Promise(function (resolve, reject) {
console.log("starting cleanRoom");
console.log("starting DB_WorkIssue.alldocs");
DB_WorkIssues.allDocs({ include_docs: true, descending: false }, function (err, response) {
data = response.rows;
itemp = 0;
console.log("at For Loop in allDocs");
for (var i = 0; i < response.total_rows; i++) {
if (data[i].doc.IsDeleted || data[i].doc.IsWorkIssueInserted || data[i].doc.IsWorkIssueUpdated || data[i].doc.IsLogInserted) {
DirtyFlag = true;
}
}
console.log("exiting allDocs");
return;
}).then(function () {
console.log("inside then function after alldocs");
}).catch(function (err) {
console.log("inside catch");
showMsg("Error in cleanRoom/allDocs: " + err);
});
console.log("exiting cleanRoom")
resolve('Cleaned The Room');
});
};
它所做的只是调用 allDocs 方法,然后在函数中查看是否有任何记录已更新。然后它可以继续。
但事实并非如此。
这是链条:
}).then(function () {
return initialize();
}).then(function (prMessage) {
**return cleanRoom();** <--- my promise
}).then(function (result) {
return removeGarbage(result);
}).then(function (result) {
return winIcecream(result);
}).then(function (result) {
console.log('finished ' + result);
}).then(function () {
console.log("starting UpdateworkIssuesJson");
return updateWorkIssuesJson();
}).then(function () {
结果:
tasksmain.js:165 starting cleanRoom
tasksmain.js:166 starting DB_WorkIssue.alldocs <-- Pouch call
tasksmain.js:188 exiting cleanroom <-- exits promise
tasksmain.js:195 inside removeGarbage <-- I don't want it to do this until Pouch call is done.
tasksmain.js:202 inside winIceCream
taskspouch.js:91 finished Cleaned The Room remove Garbage won Icecream
taskspouch.js:93 starting UpdateworkIssuesJson
tasksmain.js:182 inside then function after alldocs <-- now back to the pouch function call (way too late.
tasksmain.js:171 at For Loop in allDocs
tasksmain.js:178 exiting allDocs <--- Pouches chain
taskspouch.js:96 starting showTasks
问题是 - 原始承诺链正在按预期工作。
当“无尘室”解决时,它会继续。但洁净室在 Pouch 命令完成之前解决。当 allDoc
有没有办法防止这种情况发生?
【问题讨论】:
-
"但是洁净室在 Pouch 命令完成之前就解决了。" - 嗯,是的,这正是你告诉它要做的事情。您在启动 pouch 命令后立即致电
resolve()。 -
我明白这一点。但是无尘室是一个承诺,我不希望它在完成之前解决。我还注意到 allDocs 承诺的“then”部分发生在 allDocs 函数启动之前,更不用说完成了。
标签: javascript pouchdb