如何等待蓝鸟承诺在多个地点定居?

2024-03-17

我遇到的情况是,一堆函数需要等待承诺解决,因为它是 init 函数;

self.init=new Promise(function(resolve){
   //do stuff, take awhile
   resolve();
});

但是,当它正在初始化时,异步性质意味着依赖于它的其他函数正在被调用。我希望这些函数等待 init 完成,然后继续。

我尝试在每个函数中执行此操作

function doSomethingUseful(){
    self.init.reflect().then(function () {
       //do functions purpose
    });
}
function doSomethingUseless(){
    self.init.reflect().then(function () {
       //do functions purpose
    });
}

但它只能随机工作,可能只有在 init 已经解决的情况下才有效,如果没有解决,它就会挂在这里,奇怪地挂起整个应用程序,尽管它是异步的。

我正在尝试替换以前的解决方案,该解决方案涉及间隔并在每个函数调用中检查布尔 isInit。

有没有蓝鸟函数可以做到这一点?或者另一种继续等待并检查承诺以查看其是否得到解决的方法?

该应用程序在很多地方都有这种结构。通常围绕 sqlite 读/写。用于打开数据库的 init,但在打开时,页面正在加载,并且它已经在尝试读/写表,因此通过使用 setInterval 并重复检查 init 是否完成来强制这些读/写等待。

这是一个使用谷歌分析的例子。

function Analytics() {
    var self = this;
    self.ready = ko.observable(false).subscribeTo('application:ready'); //attached to page ready event in jquerymobile and cordova
    self.trackerInit = new Promise(function (resolve, reject) {
        ko.computed(function () {
            if (self.ready()) {
                window.ga.startTrackerWithId('id', 1000, resolve, reject);
            }
        });
    });
}

Analytics.prototype.trackSpeed = function (cat, interval, variable, label) {
    var self = this;
    console.log("speed tracker", cat, interval, variable, label); //this logs
    return self.trackerInit.then(function () {
        console.log("speed tracker confirm init"); //this never logs, all execution stops including other async code        
        return new Promise(function (resolve, reject) {
            window.ga.trackTiming(cat, interval, variable, label, resolve, reject);
        });
    }).catch(function (e) {
        if (e.message === "send timeout") {
            return true; //who cares about timeouts anyways
        } else {
            throw e;//rethrow it
        }
    });
};

函数在页面更改事件中调用,没有返回,纯异步。调用它会导致所有执行停止。

准备好的ko就这样完成了

self.ready = ko.observable(false).publishOn('application:ready');

var deviceReady = new Promise(function (resolve) {
    $(document).on('deviceready', resolve);
});
var pageReady = new Promise(function (resolve) {
    $(document).on('pagecreate', resolve);
});

Promise.all([deviceReady, pageReady]).then(function () {
   //a couple of page of code and...
   self.ready(true);
});

在检查其结果时,像这样更改 init 会产生相同的挂起结果

self.trackerInit = new Promise(function (resolve, reject) {
    console.log("initting");
    checker = setInterval(function () {
        if (window.ga) {
            console.log("ready init");
            window.ga.startTrackerWithId('id', 100, function(){
                clearInterval(checker);
                console.log("init complete");
                resolve();
            }, reject);
        }
    }, 1000);
});

它们只是承诺。只需使用then把他们拴起来

function doSomethingUseful() {
  // wait for init to finish, then do our stuff
  // return the new chained promise in case someone wants to wait on us
  return self.init.then(function () {
    // do stuff
  });
}

function doSomethingUseless() {
  // wait for init to finish, then do our stuff
  // return the new chained promise in case someone wants to wait on us
  return self.init.then(function () {
    // do stuff
  });
}


// do both of those things and then do something else!
Promise.all([doSomethingUseful(), doSomethingUseless()]).then(function () {
  console.log("init is done.  And we've done something useful and useless.")
}

Edit:

根据您的附加代码,问题是,如果应用程序在构建 Analytics 组件之前已“准备好”,那么您将永远不会收到“application:ready”(因为它在您订阅之前出现),因此您的“准备好”可观察值将保持错误。根据邮箱文档,您需要通过true作为第二个参数subscribeTo这样即使它发生在过去,您也会获得就绪值:

ko.observable(false).subscribeTo("application:ready", true)

然而,仅仅为了兑现承诺而构建所有这些可观察和计算的结果就太过分了。怎么样:

self.trackerInit = new Promise(function (resolve, reject) {
    const s = ko.postbox.subscribe("application:ready", function (value) {
       if (value) {
           s.dispose(); // stop listening (prevent memory leak
           window.ga.startTrackerWithId('id', 1000, resolve, reject);
       }
    }, true);
});

你甚至可以把它变成一个承诺助手:

function whenReady(eventName) {
    return new Promise((resolve, reject) => {
        const s = ko.postbox.subscribe(eventName, value => {
            if (ready) {
                s.dispose();
                resolve(value);
            }
        }, true);
    });
}

function startGaTracker(id, timeout) {
    return new Promise((resolve, reject) => window.ga.startTrackerWithId(id, timeout, resolve, reject);
}

然后你可以写:

self.trackerInit = whenReady("application:ready")
    .then(() => startGaTracker("id", 100));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待蓝鸟承诺在多个地点定居? 的相关文章

  • Angular2 - 在 SystemJS 中导入第 3 方 javascript

    由于某种原因 fileSaver 没有被映射 angular2 jwt 工作正常 I did npm install file saver save获取文件保护程序 然后按如下方式引用它 我有一个 gulp 任务将 js 文件移动到 lib
  • 如何在 Javascript 中获取时区名称(PDT、EST 等)? [复制]

    这个问题在这里已经有答案了 使用 Javascript 有没有办法根据用户的设备获取用户的时区名称 PDT EST 等 我尝试过的代码 const timezone jstz determine const userTimezone tim
  • JavaScript 对象镜像/单向属性同步

    出于安全目的 我需要一个 镜像 对象 也就是说 如果我创建对象 A 并浅克隆 A 的副本并将其称为 B 则每当 A 的属性发生更改时 我希望 B 自动更新自身以反映更改 但反之则不然 换句话说 单向属性同步 我的问题 是否已经存在我不知道的
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • Ng Bootstrap 日期范围选择器 [markDisabled] 不适用于输入

    我正在尝试禁用某些日期ng 引导范围选择器 https ng bootstrap github io components datepicker overview 目前 我在弹出窗口中有一个范围选择器 并且我正在使用 markDisable
  • History.pushState和页面刷新

    我开始研究 HTML5 新历史 API 不过 我有一个问题 如何处理页面刷新 例如 用户单击一个链接 该链接由 js 函数处理 该函数 异步加载页面内容 使用history pushState 更改URL 用户刷新页面 但是服务器上当然不存
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • JSLint 错误:意外的“这个”

    无法理解为什么 JSLint 对我的使用感到惊讶this在下面的代码中 function testConstr x use strict this joker Whyyy sooo seriousss this x x 对于这两个属性分配
  • 使用点符号将数字传递到函数中

    如果我有一个对象和函数 var obj 1234 example sample 5678 example sample function example num str if obj num hasOwnProperty str manip
  • 启动 onclick 比使用 document.onload 更快

    我有带有链接的 html 页面 我想在其中附加一个功能onclick事件 一种方法当然是 a href save php Save a 但我知道这不是最佳做法 所以我反而等待window onload 循环遍历链接并将保存功能附加到链接re
  • 如何在 AWS Amplify 上运行 React/Redux 应用程序的代理

    我最近实施了Proxy 在 Express js 中 对于我的反应应用程序发出请求时隐藏 API URL 当我在本地主机上运行代理和应用程序时 它工作得非常好 现在我已准备好将我的应用程序部署到AWS 放大 我对如何让我的代理在那里运行有点
  • 如何使表格单元格的最小宽度为 3 位数字?

    如何使表格中的每个单元格的最小宽度为 3 位数字且不会更大 现在我正在硬编码min width 但我不喜欢硬编码一个值 因为我将来可能想更改字体 如果需要Javascript也没关系 table border 1 tr td 1 td td
  • 防止 Bootstrap IE 下拉列表在滚动条单击时关闭

    在 IE 中 单击下拉菜单滚动条时 下拉菜单将关闭 当您使用鼠标滚轮滚动它时 效果很好 这是代码层链接 https www codeply com go Uh8qadr3q2 https www codeply com go Uh8qadr
  • jQuery clone() 复制数据...有时...?

    使用下面的示例 我有一个tr我正在复制 它包含一个 jQueryautocomplete 第一次克隆时 自动完成功能不起作用 因为附加的data items 一片空白 第二次单击 添加 按钮时 自动完成功能将起作用 此后 再次单击 添加 会
  • FB.getLoginStatus() 不起作用

    我正在尝试编写一段代码来检查用户是否登录 发现FBJS API中有一个内置方法 叫做getLoginStatus 我已经在html中实现了它 但出于某种原因 getLoginStatus 内部的alert 不会被触发 我也尝试在 init
  • Google 折线图添加对象数组

    我有一个通过解析 JSON 字符串创建的对象数组 var measurementData Html Raw JsonConvert SerializeObject this Model Item1 var stringifiedData J
  • 如何使用 Javascript 从 Chrome iOS 下载 blob 文件?

    如何使用 Javascript 从 Chrome iOS 下载 blob 文件 我正在从 iOS 下载文件 pdf excel txt png iOS 没有文件系统 这对下载来说是一个问题 我创建了一个代码 根据操作系统和导航器 如果需要
  • TinyMCE:将 CSS 类属性与 formatselect-dropdown 格式结合使用

    我想定制格式 http wiki moxiecode com index php TinyMCE Configuration theme advanced blockformats在 TinyMCE 中格式选择下拉菜单 http wiki
  • 在状态中检测到不可序列化的值,路径为:`filters.startDate` (redux-toolkit.esm.js )

    我正在使用 React 18 和 Redux 构建一个预算应用程序 我不知道这里有什么问题 import moment from moment const filtersDefaultState text sortBy date start
  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看

随机推荐

  • 删除 python 列表中的重复项但记住索引

    如何删除列表中的重复项 保留项目的原始顺序并记住列表中任何项目的第一个索引 例如 删除重复项 1 1 2 3 yields 1 2 3 但我需要记住索引 0 2 3 我正在使用Python 2 7 我会以不同的方式解决这个问题并使用Orde
  • 获取调用C#方法的实例

    我正在寻找一种算法 可以在该方法中获取调用该方法的对象 例如 public class Class1 public void Method the question object a the object that called the m
  • SVN与外部通用代码

    目前 我正在尝试使用相同的代码为多个产品设置存储库 最好的解决方案是创建共享代码的真正库并以这种方式使用它们 然而 目前这需要很长时间 这个想法是拥有一个具有以下树的单个存储库 trunk Project1 Project2 Shared
  • 在android中比较两个日期是否在同一周内

    我有两个约会 他们是从 Calendar c Calendar getInstance year c get c YEAR month c get c MONTH month date c get c DATE 其他数据分为日期 月份 2
  • 在 Curl 请求中禁用 Javascript (PHP)

    有没有办法在 PHP 的 Curl 请求中禁用 Javascript 尝试模仿浏览器请求 来自禁用 Javascript 的浏览器 这可以通过标头 用户代理 cookie 来完成吗 Thanks 有没有办法在 PHP 的 Curl 请求中禁
  • 在php中将tiff转换为jpg?

    我有一台保存 TIFF 图像的服务器 大多数客户端都可以读取和显示 TIFF 图像 因此没有问题 但是 某些客户端无法处理此格式 但可以处理 JPG 我想到使用 PHP 的 GD 库为没有 TIFF 读取能力的客户端进行服务器端转换 但我注
  • Spark:强制读取模式时 Parquet DataFrame 操作失败

    火花2 0 2 当您拥有具有不同架构的镶木地板文件并在读取期间强制使用该架构时 就会出现此问题 即使您可以打印架构并运行show 好的 您无法对缺失的列应用任何过滤逻辑 以下是两个示例架构 assuming you are running
  • 从同一类的另一个方法中检索一个方法中的 NSMutableArray [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是 iPhone 新手 我有一个小
  • SQL查询:列出一个表中未出现在另一表中的所有项目

    我正在开发一个训练跟踪程序 但我无法弄清楚 SQL 查询 我有3张桌子 employees trainingRecords masterList employees and trainingRecords是通过相关的empID fkey t
  • 在属性中传递静态数组

    是否可以绕过以下限制 在类中创建静态只读数组 public class A public static readonly int Months new int 1 2 3 然后将其作为参数传递给属性 public class FooAttr
  • 查询对象时 linq to sql + stackoverflow 异常

    好的 当我尝试查询主键 如果实体中的主键设置为 自动生成值 时 我已经确认只有这个问题 但如果没有这个 我该如何插入 抱歉 如果这是一个 linq2sql 菜鸟 但我刚刚开始使用它 如何在关闭此选项的情况下使用 Linq to Sql 同时
  • PHP 和 MySQL:显示某些内容的总和,按不同类别分类

    你能帮我一下吗 如果您能提供答案和解释 我会更加感激 因为我想了解更多 实际上我已经感谢这个社区了 对我的学习帮助很大 但只有答案对我来说就足够了 因为我真的需要这个代码 好的 现在我将定义问题 现在 假设我有包含这些列的表格 tbl tr
  • Express 应用程序中 helpers 文件夹的意义是什么?

    我正在尝试导出一个适合我们要求的最佳混合文件夹结构 但在查阅了很多文章和信息之后 我有一个用名称定义的文件夹helpers并有文件 js扩展 app controllers userController js models userSche
  • MATLAB:使用 ode45 时是否可以有两个事件值?

    我想要对运动方程的 ode45 计算有两个限制 位置和时间 我已经让时间事件起作用 但我不确定是否以及如何添加另一个事件来限制位置 编辑 我还有许多不同的粒子在一个 ODE 方程中耦合在一起 并且需要它们在到达 屋顶 时单独停止 因为它们都
  • 如何设置系统范围的umask?

    我在一个运行 Linux Debian 和 Ubuntu 的实验室工作 用户名和组名由 NIS 和 yp 处理 我们有一些公共用户 每个人都可以访问来运行实验 然后我们每个人都有自己的用户 此外还有一个我们都是其中成员的公共组 我怎样才能使
  • 如果成功或失败,如何返回 std::copy 的值?

    我在用std copy将对象复制到std deque到一个文件 代码工作正常 但我需要检查复制是否成功 因此我需要设置标志 否则抛出异常 我已经用谷歌搜索但找不到解决方案如何检查是否std copy已成功将值复制到文件中 有人可以照亮它吗
  • Java 放气响应

    大家好 我想为 tomcat 创建一个过滤器来压缩某些 MIME 类型的所有响应 有什么指导方针吗 String ae request getHeader accept encoding if ae null ae indexOf defl
  • 如何在 Node.js 插件中泵送窗口消息?

    在 Windows Nodejs 插件中 我创建了一个窗口来接收消息 Handle
  • 将相同的运算符专门用于不同的特征

    我想通过特征进行专业化来执行以下操作 Array Aa Scalar in a会使用overload I Array Aa Array Bb会使用overload II 在下面的代码中 overload II永远不会习惯 有人提到过T1不能
  • 如何等待蓝鸟承诺在多个地点定居?

    我遇到的情况是 一堆函数需要等待承诺解决 因为它是 init 函数 self init new Promise function resolve do stuff take awhile resolve 但是 当它正在初始化时 异步性质意味