【问题标题】:Greater/Less than operator behave differently than equal operator on Q promises大于/小于运算符的行为与 Q 承诺上的相等运算符不同
【发布时间】:2015-10-18 07:04:34
【问题描述】:

在使用 Javascript 承诺时,我遇到了这种奇怪的行为。考虑以下代码:

var Q = require('q');

var d1 = Q.defer();
var d2 = Q.defer();

compare(d1.promise, d2.promise);

d1.resolve(3);
d2.resolve(3);

function compare(a, b) {
 Q.all([a,b]).then(function(results) {
  console.log('a: ' + a + '   b: ' + b);
  var result =  (a == b)? 1: -1;
  console.log(result);

 });
}

当您运行此代码时,您会得到 -1。我意识到到那时我没有评估传递给匿名函数的结果变量(我应该这样做)。我的具体问题是这样的:

如果您使用大于 (>) 或小于 (

所以奇怪的行为是 == 在承诺方面的行为与 不同。似乎小于 () 在某种程度上具有等待 Promise 的结果的特殊能力,而相等运算符 (==, ===) 则没有。

谁能解释这种行为?

【问题讨论】:

  • 不,</> 不要等待承诺的结果。 做到了,通过使用Q.allthen 回调。只有到那时,.valueOf 才会给出相应的结果 - 有关详细信息,请参阅 @FelixKling 的答案。

标签: javascript promise comparison q


【解决方案1】:

如果相等,则结果为 false,因为您正在比较两个不相同的对象:

来自spec

7.2.12 抽象等式比较

...
3. 如果 Type(x) 与 Type(y) 相同,则
返回执行严格等式比较的结果 x === y。
...

7.2.13 严格等式比较

...
8.如果x和y是相同的Object值,返回true。
9. 返回 false。


但是,the relational comparison 仅针对字符串和数字定义。因此,JavaScript 在比较 Promise 之前会执行 类型转换。在这个过程中它会调用对象的valueOf 方法,所以它实际上会比较a.valueOfb.valueOf 的返回值。除此之外,Q overrides the default valueOf implementation to return the resolved value

// XXX deprecated
promise.valueOf = function () {
    if (messages) {
        return promise;
    }
    var nearerValue = nearer(resolvedPromise);
    if (isPromise(nearerValue)) {
        resolvedPromise = nearerValue; // shorten chain
    }
    return nearerValue;
};

但你可以看到库不鼓励它,很可能是因为standard promises 没有实现这样的行为。


简化演示:

> var a = {valueOf: function() { return 0; }};
> var b = {valueOf: function() { return 0; }};
> a == b
false
> a >= b
true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多