【问题标题】:javascript promise not passing all arguments (using Q)javascript 承诺不传递所有参数(使用 Q)
【发布时间】:2013-07-31 23:32:30
【问题描述】:

我无法传递所有参数。我的 promise 回调只收到一个而不是三个:

var asyncFunction= function(resolve) {
    setTimeout(function() {
        resolve("Some string that is passed", "and another", "third");
    }, 1000);
};

var promiseFunction = function () {
    var deferred = Q.defer();

    asyncFunction(deferred.resolve);

    return deferred.promise;
};

promiseFunction().then(function() {
    // Only one argument is passed here instead of 3
    // { '0': 'Some string that is passed' }
    console.log(arguments); 
});

知道我做错了什么吗?

【问题讨论】:

  • 我的钱用于强制类型转换

标签: javascript node.js promise deferred q


【解决方案1】:

如果您想传递多个值,则必须将它们包装在您传递的另一个值中,例如数组或对象。

【讨论】:

    【解决方案2】:

    同步函数只返回一个值,异步应该用一个来解析。

    创建解析多个值的异步函数是一种不好的做法。如果要传递多个值,请将它们以数组或 dict 对象的形式返回,就像给定函数是同步的一样。

    【讨论】:

    • 大量使用回调的库传回多个参数;我不认为这是不好的做法。支持多个值的 Promises/Futures 似乎也是一个合乎逻辑的步骤。我认为应该对此进行探索,mailing list entry 也是如此。
    • Matt,最初在我维护的库中,我尝试允许多个分辨率值,但我很快拒绝了这个想法。我现在不记得确切的问题了,但我相信在某些情况下我需要将解析的值作为一个对象来处理,而且总是处理数组或参数对象很奇怪(并且与同步函数不一样) .决策已经被创造出来并且在实践中被证明是正确的。如您所见,您链接的帖子很快就被删除了。我不记得有人认真考虑过这种想法。
    • 我只关心,因为我正在编写一个 promises 库(用于娱乐和学习),并且多个解决参数对我来说是一个很自然的解决方案。如果社区已经确定了一个单一的价值,我想也是。感谢您的跟进。
    • @Matt,完全同意。 Promise 解决了讨厌的回调嵌套问题,但回调仍然允许传递多个参数。我不能将多个参数传递给.resolve,这感觉很荒谬,相反我必须将它打包到一个数组中并在回调中解包导致一团糟。这不是 promises 一开始就避免的,一团糟吗?
    【解决方案3】:

    Q 承诺可以是resolved,只有一个参数 - 承诺代表一个单一的值,而不是它们的集合。如果您需要多个值,请将它们显式放入数组中。对于多参数回调,您可以使用.spread()

    【讨论】:

    • 这怎么可能?有成千上万个带有异步函数的库,它们返回多个参数?那它们就不能用了吗?
    • 似乎只有包装。你有什么特别的想法吗?
    • @Tomalak:我想说有很多价值(我自己的 Promise 实现允许这样做)并且传递 arguments 对象可以简化代码。当然,Q 是用不同的范式从头开始构建的,现在改变它会很复杂。
    • @Tomalak:您可以编写更简洁的回调函数,而无需访问值的属性/索引。将数组视为元组,而不是列表。 $.ajax promises 就是一个很好的例子。
    • @ForbesLindesay:实际上我没有看到 A+ 禁止多个值 - 我想我们将不得不在某个时候讨论这个问题,我会打开一个问题。还有even synchronous code can return multiple values - 虽然目前在 JavaScript 中是不允许的(解构赋值可能会为此提供语法),但它是其他语言中的 feature
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2014-03-23
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多