javascript承诺不传递所有参数(使用Q)

javascript承诺不传递所有参数(使用Q),javascript,node.js,promise,deferred,q,Javascript,Node.js,Promise,Deferred,Q,我很难通过所有的论点。我的承诺回拨只收到一次,而不是三次: var asyncFunction= function(resolve) { setTimeout(function() { resolve("Some string that is passed", "and another", "third"); }, 1000); }; var promiseFunction = function () { var deferred = Q.defer()

我很难通过所有的论点。我的承诺回拨只收到一次,而不是三次:

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); 
});

你知道我做错了什么吗?

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

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


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

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

我的钱在类型强制上这怎么可能?有数千个库具有返回多个参数的异步函数?那它们就不能用了吗?看起来只有用包装纸。你有什么特别的想法吗?@Tomalak:我想说有很多价值(我自己的promise实现允许它),传递
参数
对象可以简化代码。当然,
Q
是从零开始用不同的范例构建的,现在修改它会很复杂。@Tomalak:您可以编写更简洁的回调函数,而无需访问值的属性/索引。将数组看作元组,而不是列表。这将是一个很好的例子。@ForbesLindesay:事实上,我没有看到一个+禁止多个值-我想我们会在某个时候讨论这个问题,我会提出一个问题。和-虽然目前JavaScript中不允许使用它(解构赋值可能会给出一个语法),但它是其他语言中的一个功能;我不认为这种做法不好。支持多种价值的承诺/期货似乎也是一个合乎逻辑的步骤。马特,最初我在图书馆里,我坚持我尝试过允许多个分辨率值,但我很快就拒绝了这个想法。我现在不记得确切的问题了,但是我相信有些情况下我需要把解析的值作为一个对象来处理,而且总是处理数组或参数对象是很奇怪的(而且不等同于同步函数)。这个决定已经被创造出来,并在实践中被证明是正确的。你看到的链接的帖子很快就被放下了。我不记得有人认真考虑过这样的想法。我之所以在乎,是因为我正在写一个承诺库(为了好玩和学习),多重解决争论对我来说是一个很自然的解决方案。如果社区已经确定了一个单一的价值观,我想也是。谢谢你的跟进。@Matt,非常同意。承诺解决了令人讨厌的回调嵌套问题,但回调仍然允许传递多个参数。我不能将多个参数传递给
.resolve
,而必须将其打包到数组中,并在回调中解包,这让人觉得很可笑,这会导致混乱。这不是承诺一开始就避免的吗,一团糟?