使用 Promise 语法编写同步代码有什么好处吗?

2024-05-09

有同步承诺这样的概念吗?使用 Promise 语法编写同步代码有什么好处吗?

try {
  foo();
  bar(a, b);
  bam();
} catch(e) {
  handleError(e);
}

...可以写成类似的东西(但使用同步版本then);

foo()
  .then(bar.bind(a, b))
  .then(bam)
  .fail(handleError)

有同步承诺这样的概念吗?

本杰明是绝对正确的。Promise 是一种 monad https://blog.jcoglan.com/2011/03/11/promises-are-the-monad-of-asynchronous-programming/。然而,它们并不是唯一的类型。

如果您还没有意识到这一点,那么您可能想知道 monad 是什么。网上有很多关于 monad 的解释。然而,他们中的大多数都患有Monad 教程谬误 https://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/.

简而言之,这个谬论是大多数理解单子的人并不真正知道如何向其他人解释这个概念。简单来说,单子是一个抽象的概念,人类很难掌握抽象的概念。然而,人类很容易理解具体的概念。

因此,让我们从一个具体的概念开始,开始理解单子。正如我所说,单子是一个抽象概念。这意味着 monad 是一个界面 http://en.wikipedia.org/wiki/Interface_%28computing%29没有执行 http://en.wikipedia.org/wiki/Implementation(即它定义了某些操作并指定了这些操作应该做什么,但没有指定必须如何完成)。

现在,有不同类型的单子。每种类型的 monad 都是具体的(即它定义了一个执行 http://en.wikipedia.org/wiki/Implementation单子的界面 http://en.wikipedia.org/wiki/Interface_%28computing%29)。 Promise 是一种 monad。因此,promise 是 monad 的一个具体例子。因此,如果我们研究 Promise,那么我们就可以开始理解 monad。

那么我们从哪里开始呢?幸运的是,用户spike https://stackoverflow.com/users/896697/spike给了我们一个很好的起点comment https://stackoverflow.com/questions/28937788/would-there-be-any-benefit-to-writing-synchronous-code-using-the-syntax-of-promi#comment46130667_28937788对于你的问题:

我能想到的一个例子是将 Promise 与同步代码链接在一起。在寻找这个问题的答案时:根据场景动态生成AJAX请求 https://stackoverflow.com/q/28418601/783743我将同步调用包装在 Promise 中,以便能够将它们与其他 Promise 链接起来。

那么我们来看看他的代码:

var run = function() {
    getScenario()
    .then(mapToInstruction)
    .then(waitForTimeout)
    .then(callApi)
    .then(handleResults)
    .then(run);
};

这里的run函数返回一个承诺,它由返回的承诺组成getScenario, mapToInstruction, waitForTimeout, callApi, handleResults and run本身被锁链在一起。

现在,在我们继续之前,我想向您介绍一种新的符号来可视化这些函数正在做什么:

run              :: Unit        -> Deferred a
getScenario      :: Unit        -> Deferred Data
mapToInstruction :: Data        -> Deferred Instruction
waitForTimeout   :: Instruction -> Deferred Instruction
callApi          :: Instruction -> Deferred Data
handleResults    :: Data        -> Deferred Unit

所以这是细分:

  1. The ::符号的意思“属于这种类型”->符号的意思“to”。因此,例如,run :: Unit -> Deferred a读作run属于类型Unit to Deferred a.
  2. 这意味着run是一个函数,它需要一个Unitvalue(即无参数)并返回 type 的值Deferred a.
  3. Here, a表示任何类型。我们不知道什么类型a是并且我们不关心什么类型a是。因此,它可以是任何类型。
  4. Here, Deferred是一个承诺数据类型(具有不同的名称)并且Deferred a意味着当承诺得到解决时,它会产生一个类型的值a.

从上面的可视化中我们可以学到一些东西:

  1. 每个函数都接受一些值并返回一个承诺。
  2. 每个 Promise 返回的解析值将成为下一个函数的输入:

    run              :: Unit -> Deferred a
    getScenario      ::                  Unit -> Deferred Data
    
    getScenario      :: Unit -> Deferred Data
    mapToInstruction ::                  Data -> Deferred Instruction
    
    mapToInstruction :: Data -> Deferred Instruction
    waitForTimeout   ::                  Instruction -> Deferred Instruction
    
    waitForTimeout   :: Instruction -> Deferred Instruction
    callApi          ::                         Instruction -> Deferred Data
    
    callApi          :: Instruction -> Deferred Data
    handleResults    ::                         Data -> Deferred Unit
    
    handleResults    :: Data -> Deferred Unit
    run              ::                  Unit -> Deferred a
    
  3. 在前一个 Promise 得到解析之前,下一个函数无法执行,因为它必须使用前一个 Promise 的解析值。

现在,正如我之前提到的,单子是界面 http://en.wikipedia.org/wiki/Interface_%28computing%29它定义了某些操作。 monad 接口提供的操作之一是链接 monad 的操作。如果是承诺的话,这是then方法。例如:

getScenario().then(mapToInstruction)

我们知道:

getScenario      :: Unit -> Deferred Data
mapToInstruction :: Data -> Deferred Instruction

Hence:

getScenario()    :: Deferred Data -- because when called, getScenario
                                  -- returns a Deferred Data value

我们还知道:

getScenario().then(mapToInstruction) :: Deferred Instruction

由此,我们可以推论:

then :: Deferred a -> (a -> Deferred b) -> Deferred b

用言语来说,then是一个带有两个参数的函数(类型的值Deferred a和类型的函数a -> Deferred b) 并返回类型的值Deferred b.” Hence:

then          :: Deferred a    -> (a -> Deferred b) -> Deferred b
getScenario() :: Deferred Data

-- Therefore, since a = Data

getScenario().then :: (Data -> Deferred b)          -> Deferred b
mapToInstruction   ::  Data -> Deferred Instruction

-- Therefor, since b = Instruction

getScenario().then(mapInstruction) :: Deferred Instruction

所以我们得到了第一个 monad 操作:

then :: Deferred a -> (a -> Deferred b) -> Deferred b

然而,这个操作是具体的。它特定于承诺。我们想要一个可以适用于任何 monad 的抽象操作。因此,我们概括该函数,使其可以适用于任何 monad:

bind :: Monad m => m a -> (a -> m b) -> m b

请注意,这bind函数与 无关Function.prototype.bind https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind. This bind函数是then功能。然后then函数特定于 Promise。但是,那bind功能是通用的。它可以适用于任何单子m.

胖箭头=> means 有界量化 https://en.wikipedia.org/wiki/Bounded_quantification. If a and b可以是任何类型m可以是任何类型它实现了 monad 接口。我们不在乎什么类型m只要它实现了 monad 接口即可。

这就是我们实施和使用的方式bindJavaScript 中的函数:

function bind(m, f) {
    return m.then(f);
}

bind(getScenario(), mapToInstruction);

这个怎么通用呢?好吧,我可以创建一个新的数据类型来实现then功能:

// Identity :: a -> Identity a

function Identity(value) {
    this.value = value;
}

// then :: Identity a -> (a -> Identity b) -> Identity b

Identity.prototype.then = function (f) {
    return f(this.value);
};

// one :: Identity Number

var one = new Identity(1);

// yes :: Identity Boolean

var yes = bind(one, isOdd);

// isOdd :: Number -> Identity Boolean

function isOdd(n) {
    return new Identity(n % 2 === 1);
}

代替bind(one, isOdd)我本可以轻松地写出one.then(isOdd)(这实际上更容易阅读)。

The Identity数据类型,就像 Promise 一样,也是 monad 的一种类型。事实上,它是所有单子中最简单的。它被称为Identity因为它不会对其输入类型执行任何操作。它保持原样。

不同的单子有不同的作用,这使得它们很有用。例如,Promise 具有管理异步性的效果。这Identity然而 monad 没有任何效果。它是一个vanilla数据类型。

不管怎样,继续......我们发现了 monad 的一种操作,bind功能。还有一项操作有待发现。事实上,用户spike https://stackoverflow.com/users/896697/spike他在上述评论中提到了这一点:

我将同步调用包装在 Promise 中,以便能够将它们与其他 Promise 链接起来。

你看,问题是第二个参数then函数必须是一个返回 Promise 的函数:

then :: Deferred a -> (a -> Deferred b) -> Deferred b
                      |_______________|
                              |
                    -- second argument is a function
                    -- that returns a promise

这意味着第二个参数必须是异步的(因为它返回一个承诺)。然而,有时我们可能希望将同步函数与then。为此,我们将同步函数的返回值包装在 Promise 中。例如,这就是spike https://stackoverflow.com/users/896697/spike did:

// mapToInstruction :: Data -> Deferred Instruction

// The result of the previous promise is passed into the 
// next as we're chaining. So the data will contain the 
// result of getScenario
var mapToInstruction = function (data) {
    // We map it onto a new instruction object
    var instruction = {
        method: data.endpoints[0].method,
        type: data.endpoints[0].type,
        endpoint: data.endpoints[0].endPoint,
        frequency: data.base.frequency
    };

    console.log('Instructions recieved:');
    console.log(instruction);

    // And now we create a promise from this
    // instruction so we can chain it
    var deferred = $.Deferred();
    deferred.resolve(instruction);
    return deferred.promise();
};

正如你所看到的,返回值mapToInstruction函数是instruction。然而,我们需要将它包装在一个 Promise 对象中,这就是我们这样做的原因:

// And now we create a promise from this
// instruction so we can chain it
var deferred = $.Deferred();
deferred.resolve(instruction);
return deferred.promise();

事实上,他也在做同样的事情handleResults函数还有:

// handleResults :: Data -> Deferred Unit

var handleResults = function(data) {
    console.log("Handling data ...");
    var deferred = $.Deferred();
    deferred.resolve();
    return deferred.promise();
};

最好将这三行放入一个单独的函数中,这样我们就不必重复自己:

// unit :: a -> Deferred a

function unit(value) {
    var deferred = $.Deferred();
    deferred.resolve(value);
    return deferred.promise();
}

使用这个unit我们可以重写函数mapToInstruction and handleResults如下:

// mapToInstruction :: Data -> Deferred Instruction

// The result of the previous promise is passed into the 
// next as we're chaining. So the data will contain the 
// result of getScenario
var mapToInstruction = function (data) {
    // We map it onto a new instruction object
    var instruction = {
        method: data.endpoints[0].method,
        type: data.endpoints[0].type,
        endpoint: data.endpoints[0].endPoint,
        frequency: data.base.frequency
    };

    console.log('Instructions recieved:');
    console.log(instruction);

    return unit(instruction);
};

// handleResults :: Data -> Deferred Unit

var handleResults = function(data) {
    console.log("Handling data ...");
    return unit();
};

事实上,事实证明unitfunction 是 monad 接口中第二个缺失的操作。概括后,可以将其可视化如下:

unit :: Monad m => a -> m a

它所做的只是将一个值包装在 monad 数据类型中。这允许您将常规值和函数提升到一元上下文中。例如,Promise 提供异步上下文并且unit允许您将同步函数提升到这个异步上下文中。类似地,其他单子也提供其他效果。

构成unitwith a function 允许您将函数提升到一元上下文中。例如,考虑isOdd我们之前定义的函数:

// isOdd :: Number -> Identity Boolean

function isOdd(n) {
    return new Identity(n % 2 === 1);
}

如果按如下方式定义它会更好(尽管速度较慢):

// odd :: Number -> Boolean

function odd(n) {
    return n % 2 === 1;
}

// unit :: a -> Identity a

function unit(value) {
    return new Identity(value);
}

// isOdd :: Number -> Identity Boolean

function idOdd(n) {
    return unit(odd(n));
}

如果我们使用一个,它看起来会更好compose功能:

// compose :: (b -> c) -> (a -> b) -> a -> c
//            |______|    |______|
//                |           |
function compose( f,          g) {

    // compose(f, g) :: a -> c
    //                  |
    return function (   x) {
        return f(g(x));
    };
}

var isOdd = compose(unit, odd);

我之前提到过 monad 是界面 http://en.wikipedia.org/wiki/Interface_%28computing%29没有执行 http://en.wikipedia.org/wiki/Implementation(即它定义了某些操作并指定了这些操作应该做什么,但没有指定必须如何完成)。因此,单子是一个接口:

  1. 定义某些操作。
  2. 指定这些操作应该做什么。

我们现在知道 monad 的两个操作是:

bind :: Monad m => m a -> (a -> m b) -> m b

unit :: Monad m => a -> m a

现在,我们将看看这些操作应该做什么或者它们应该如何表现(即我们将看看管理 monad 的法则):

// Given:

// x :: a
// f :: Monad m => a -> m b
// h :: Monad m => m a
// g :: Monad m => b -> m c

// we have the following three laws:

// 1. Left identity

bind(unit(x), f)    === f(x)

unit(x).then(f)     === f(x)

// 2. Right identity

bind(h, unit)       === h

h.then(unit)        === h

// 3. Associativity

bind(bind(h, f), g) === bind(h, function (x) { return bind(f(x), g); })

h.then(f).then(g)   === h.then(function (x) { return f(x).then(g); })

给定一个我们可以定义的数据类型then and unit违反这些法律的职能。在这种情况下,那些特定的实现then and unit是不正确的。

例如,数组是一种表示非确定性计算的 monad。让我们定义一个不正确的unit数组的函数(bind数组的函数是正确的):

// unit :: a -> Array a

function unit(x) {
    return [x, x];
}

// concat :: Array (Array a) -> Array a

function concat(h) {
    return h.concat.apply([], h);
}

// bind :: Array a -> (a -> Array b) -> Array b

function bind(h, f) {
    return concat(h.map(f));
}

这个错误的定义unit对于数组违反第二定律(右恒等式):

// 2. Right identity

bind(h, unit) === h

// proof

var h   = [1,2,3];

var lhs = bind(h, unit) = [1,1,2,2,3,3];

var rhs = h = [1,2,3];

lhs !== rhs;

正确的定义是unit对于数组来说是:

// unit :: a -> Array a

function unit(x) {
    return [x];
}

需要注意的一个有趣的属性是数组bind功能是按照以下方式实现的concat and map。然而,数组并不是唯一拥有此属性的 monad。每个单子bind函数可以用通用的一元版本来实现concat and map:

concat :: Array (Array a) -> Array a

join   :: Monad m => m (m a) -> m a

map    :: (a -> b) -> Array a -> Array b

fmap   :: Functor f => (a -> b) -> f a -> f b

如果您对什么感到困惑functor https://en.wikipedia.org/wiki/Functor那就别担心了。函子只是一种实现以下功能的数据类型fmap功能。根据定义,每个单子也是一个函子。

我不会详细介绍单子定律以及如何实现fmap and join加在一起就相当于bind。您可以在以下位置阅读有关它们的信息维基百科页面 https://en.wikipedia.org/wiki/Monad_(functional_programming)#Monad_laws.

顺便说一句,根据JavaScript 幻想世界规范 https://github.com/fantasyland/fantasy-land the unit函数被调用ofbind函数被调用chain。这将允许您编写如下代码:

Identity.of(1).chain(isOdd);

无论如何,回到你的主要问题:

使用 Promise 语法编写同步代码有什么好处吗?

是的,使用 Promise 语法(即一元代码)编写同步代码可以获得很大的好处。许多数据类型都是 monad,使用 monad 接口,您可以对不同类型的顺序计算进行建模,例如异步计算、非确定性计算、失败计算、状态计算、日志记录计算等。我最喜欢的使用 monad 的示例之一是使用免费 monad 来创建语言解释器 http://debasishg.blogspot.in/2013/01/a-language-and-its-interpretation.html.

Monad 是函数式编程语言的一个特性。使用 monad 可以促进代码重用。从这个意义上来说,它绝对是好的。然而,这是有代价的。函数代码比过程代码慢几个数量级。如果这对您来说不是问题,那么您绝对应该考虑编写单子代码。

一些更流行的 monad 是数组(用于非确定性计算),Maybemonad(对于可能失败的计算,类似于NaN以浮点数表示)和单子解析器组合器 https://hackage.haskell.org/package/parsec.

try {
  foo();
  bar(a, b);
  bam();
} catch(e) {
  handleError(e);
}

...可以写成类似的东西(但使用同步版本then);

foo()
  .then(bar.bind(a, b))
  .then(bam)
  .fail(handleError)

是的,你绝对可以编写这样的代码。请注意,我没有提到任何有关fail方法。原因是你不需要特殊的fail根本没有方法。

例如,让我们为可能失败的计算创建一个 monad:

function CanFail() {}

// Fail :: f -> CanFail f a

function Fail(error) {
    this.error = error
}

Fail.prototype = new CanFail;

// Okay :: a -> CanFail f a

function Okay(value) {
    this.value = value;
}

Okay.prototype = new CanFail;

// then :: CanFail f a -> (a -> CanFail f b) -> CanFail f b

CanFail.prototype.then = function (f) {
    return this instanceof Okay ? f(this.value) : this;
};

然后我们定义foo, bar, bam and handleError:

// foo :: Unit -> CanFail Number Boolean

function foo() {
    if (someError) return new Fail(1);
    else return new Okay(true);
}

// bar :: String -> String -> Boolean -> CanFail Number String

function bar(a, b) {
    return function (c) {
        if (typeof c !== "boolean") return new Fail(2);
        else return new Okay(c ? a : b);
    };
}

// bam :: String -> CanFail Number String

function bam(s) {
    if (typeof s !== "string") return new Fail(3);
    else return new Okay(s + "!");
}

// handleError :: Number -> Unit

function handleError(n) {
    switch (n) {
    case 1: alert("unknown error");    break;
    case 2: alert("expected boolean"); break;
    case 3: alert("expected string");  break;
    }
}

最后,我们可以如下使用它:

// result :: CanFail Number String

var result = foo()
            .then(bar("Hello", "World"))
            .then(bam);

if (result instanceof Okay)
    alert(result.value);
else handleError(result.error);

The CanFail我描述的 monad 实际上是Either函数式编程语言中的 monad。希望有帮助。

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

使用 Promise 语法编写同步代码有什么好处吗? 的相关文章

  • 禁用内容安全策略

    当我开发网站时 我经常想看看特定功能在网站上的外观如何 所以我会使用 chrome 开发者工具并经常运行一些 javascript 脚本 我经常发现一些脚本由于内容安全策略 CSP 而无法运行的问题 我完全理解该策略是为了防止跨站点脚本攻击
  • 我如何在 AngularJS 中监听点击并按住的情况?

    我制作了一个时间计数器 您可以通过单击按钮来增加或减少时间 然而 我希望当我单击并按住按钮时 时间的价值会不断攀升 所以目前如果你看到我的Plunkr http plnkr co edit BxX9x5zYFMXVqt5JsN1F p pr
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 动态速度计 javascript 或 jquery 插件

    我希望有动态ajax插件在页面上显示速度计 一个想法是我设置一个背景并旋转针 有人知道相关插件吗 这里有一些供您参考 http bernii github com gauge js http bernii github com gauge
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • Mongoose 和 Promise:如何获取查询结果数组?

    使用猫鼬从数据库和 Q 中查询结果以获取承诺 但发现很难只获取可用用户列表 目前我有一些这样的东西 var checkForPerson function person people mongoose model Person Person
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas

随机推荐

  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 使用 XSLT 从文本文件中删除第一行

    我正在使用一个生成文本文件的系统 Maximo 我需要删除文件的第一行 做到这一点的方法应该是使用 XSLT 任何想法 是的 您可以在 XSLT 中完成您想要的事情 如果您可以选择的话 在 XSLT 2 0 中这样做可能会更容易 Micha
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • JavaScript 右移负数

    这是片段 var i 101 console log 101 i toString 2 console log 101 gt gt 1 i gt gt 1 toString 2 var l 101 console log 101 l toS
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 如何动态创建 Luigi 任务

    我正在为 Luigi Tasks 构建一个包装器 但遇到了一个障碍Register http luigi readthedocs io en stable modules luigi task register html Register该
  • JQuery UI - 无法更改模态对话框中日期选择器中的月份/年份

    Using 日期选择器里面一个模态对话框 不工作更改月份 年份Firefox 19 0 2 中的下拉列表请参阅 http jsfiddle net 469zV 2 http jsfiddle net 469zV 2 HTML div tit
  • Android进程调度

    我试图更好地理解 以便在创建 Android 应用程序 服务时确定潜在的互操作性问题对可靠性的影响 我想弄清楚进程优先级是如何确定的 服务和活动之间优先级的差异以及调度程序是否以不同方式对待它们的优先级 基本上 我试图深入了解某个活动或服务
  • 制作一个固定大小的 UIView,如 UISwitch(使用 IBDesignable)

    当我使用时本指南 http iphonedev tv blog 2014 12 15 create an ibdesignable uiview subclass with code from an xib file in xcode 6要
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • 更改 Android 中突出显示文本的颜色

    我不确定这是否可能 也许有人可以纠正我 我在 Android 应用程序中有一个 EditText 视图 该视图在蓝色背景上有白色文本 当选择文本时 通过长按和编辑对话框 我希望突出显示为白色并将文本颜色更改为黑色 令人烦恼的是 似乎没有办法
  • React + 路由器 + Google 标签管理器

    我花了一些时间在 Quickcypher com 上开发 MVP 我想开始进行一些分析 它对于跟踪总访问量非常有用 但是当我尝试跟踪使用 React Router 的网站上的不同 URL 时 情况却出问题了 我的方法是这样的 设置一个在某些
  • Android VideoView 中纵向视频方向错误

    我在 Android 设备上以肖像方向拍摄新视频 如下所示 Intent intent new Intent android provider MediaStore ACTION VIDEO CAPTURE startActivityFor
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • firebase批量更新和onWrite触发同步

    我在同步两个 Firebase 云函数时遇到问题 第一个函数对多个文档执行批量更新 第二个函数由onWrite触发这些文档之一 为了便于说明 假设我有两个文档A and B 在两个单独的集合中 第一个云功能更新两个文档A and B有消防库
  • 按字母顺序对对象的 ArrayList 进行排序

    我必须创建一个方法来排序数组列表根据电子邮件按字母顺序排列对象 然后打印排序后的数组 我在排序时遇到麻烦的部分 我已经研究过并尝试使用Collections sort vehiclearray 但这对我不起作用 我是因为我需要一个叫做比较器
  • 在读/写二进制数据结构时访问位域

    我正在为二进制格式编写一个解析器 这种二进制格式涉及不同的表 这些表同样采用二进制格式 通常包含不同的字段大小 其中 50 100 个之间 大多数这些结构都有位域 并且在 C 语言中表示时看起来像这样 struct myHeader uns
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind