2013-07-31 4 views
15

У меня возникли проблемы с передачей всех аргументов. Мое обещание callback получает только один вместо трех:javascript обещание не передавать все аргументы (используя Q)

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

Любая идея, что я делаю неправильно?

+0

мои деньги на типе принуждение –

ответ

12

Q обещания могут быть resolve d только с одним аргументом - обещание означает одно значение, а не их коллекцию. Поместите их в массив явно, если вам нужно несколько значений. Для многопараметрических обратных вызовов вы можете использовать .spread().

+1

как это возможно? Существуют тысячи библиотек с асинхронными функциями, которые возвращают несколько аргументов? Разве они не могут быть использованы тогда? – Nick

+0

Только с оберткой кажется. У вас есть особое мнение? – Bergi

+0

@Nick Вся библиотека сосредоточена вокруг подхода с одним значением. [Посмотрите на источник] (https://github.com/kriskowal/q/blob/424dbd1f8c4a6a40a4b2c341598955b3880bfe79/q.js#L571) и попытайтесь выяснить, какие изменения потребуются для поддержки нескольких значений. Вы будете удивлены тому, насколько сложно это получить, в то время как мало или вообще не имеет реальной ценности. Используйте массив, как предлагает Берги. – Tomalak

2

Синхронные функции возвращают только одно значение, так же как и асинхронный должен разрешаться с одним.

Неплохая практика создания асинхронных функций, которые разрешают многие значения. Если вы хотите передать много значений, верните их в массив или объект dict, как и вы, если данная функция будет синхронной.

+1

Множество библиотек, использующих обратные вызовы, передают несколько аргументов; Я не считаю эту плохую практику. Обещания/фьючерсы, поддерживающие несколько значений, также кажутся логичным шагом. Я думаю, что это нужно изучить, как и это [запись списка рассылки] (http: //lists.w3.орг/Архивы/Public/WWW-дом/2013AprJun/0059.html). – Matt

+0

Мэтт, изначально в библиотеке, которую я поддерживаю, я экспериментировал с учетом нескольких значений для разрешения, но я быстро отверг эту идею. Сейчас я не помню точных проблем, но я считаю, что были случаи, когда мне приходилось иметь дело с разрешенным значением как с одним объектом, и это было странно (а не наравне с функциями синхронизации) всегда иметь дело с массивом или аргументом объекта , Решение уже принято и доказано на практике. Сообщение, которое вы связали, как видите, было быстро отложено. Я не помню, чтобы такая идея серьезно рассматривалась. –

+0

Мне все равно, потому что я пишу библиотеку обещаний (для удовольствия и обучения), и множество разрешительных аргументов кажется таким естественным решением для меня. Если сообщество установило единую ценность, так что, полагаю. Спасибо за продолжение. – Matt

0

Если вы хотите передать несколько значений, вы должны обернуть их в другое значение, которое вы передаете, например массив или объект.