javascriptPromise不传递所有参数(使用Q)

IT技术 javascript node.js promise deferred q
2021-03-08 13:22:28

我无法传递所有参数。我的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); 
});

知道我做错了什么吗?

3个回答

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

这怎么可能?有成千上万个带有异步函数的库可以返回多个参数吗?那不能用吗?
2021-04-25 13:22:28
似乎只有一个包装。你有什么特别的想法吗?
2021-04-30 13:22:28
@Tomalak:您可以编写更简洁的回调函数,而无需访问值的属性/索引。将数组视为元组,而不是列表。$.ajaxPromise将是一个很好的例子。
2021-05-04 13:22:28
@Tomalak:我想说有很多value(我自己的Promise实现允许它)并且传递arguments对象可以简化代码。当然,它Q是从头开始使用不同的范式构建的,现在更改它会很复杂。
2021-05-06 13:22:28
@ForbesLindesay:实际上我没有看到 A+ 禁止多个值 - 我想我们将不得不在某个时候讨论这个问题,我会提出一个问题。而且即使同步代码可以返回多个值-虽然目前还没有在JavaScript中允许的(拆解作业可能给该语法),它是一种功能,在其他语言。
2021-05-16 13:22:28

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

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

@Matt,完全同意。Promise 解决了令人讨厌的回调嵌套问题,但回调仍然允许传递多个参数。我不能将多个参数传递给.resolve这感觉很荒谬,相反我必须将它打包成一个数组并在回调中解包导致一团糟。这难道不是 Promise 一开始就想避免的,一团糟吗?
2021-04-26 13:22:28
我只关心因为我正在编写一个 promises 库(为了好玩和学习)并且多个解决参数对我来说感觉就像一个很自然的解决方案。如果社区已经确定了一个单一的value,我想也是如此。感谢您的跟进。
2021-05-01 13:22:28
马特,最初在图书馆我坚持我尝试允许多个分辨率值,但我很快拒绝了这个想法。我现在不记得确切的问题了,但我相信有些情况下我需要将已解析的值作为一个对象来处理,并且总是处理数组或参数对象很奇怪(并且与同步函数不一样) . 决策已经被创造出来并在实践中被证明是正确的。正如您所见,您链接的帖子很快就被放下了。我不记得有人认真考虑过这样的想法。
2021-05-12 13:22:28
大量使用回调的库会传回多个参数;我不认为这是不好的做法。支持多个值的 Promises/Futures 似乎也是一个合乎逻辑的步骤。我认为这应该被探索,这个邮件列表条目也是如此
2021-05-20 13:22:28

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