【问题标题】:Promises not working if PouchDB call in promise如果 PouchDB 在 promise 中调用,则 Promise 不起作用
【发布时间】: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


【解决方案1】:

你忘了用内部承诺解决。

只需执行resolve(DB_WorkIssues.allDocs({ include_docs: true, descending: false },…) 而不是使用字符串解析承诺(立即解决承诺)。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多