2014-10-09 3 views
0

Я использую Q.all в сочетании с spread для того, чтобы перенести две promise.then быть проведены одновременно с успешным разрешением в promise:ошибок с использованием расшир Q.all

var p1=112; 
var p2=function(data){ 
    console.log(data); 
    return getFormDataWithDropdown(objtype,scenario); 
}; 
var guidRequest=processGuidRequest(); 
if(!Q.isPromise(guidRequest)) 
{ 
    guidRequest=Q(guidRequest); 
} 
guidRequest.all([p1,p2]) 
.spread(function(geoVal,formVal){ 
    console.log(geoVal); 
    console.log(formVal); 
}).done(); 

p1 является value и p2 является функцией, которая возвращает function с именем getFormDataWithDropdown, который возвращает promise или value на основе разрешения набора из набора promise.Но я получаю эту ошибку при запуске этого кода:

Uncaught TypeError: Function.prototype.apply: Arguments list has wrong type 

Ошибка возникает в этой функции:

Promise.prototype.spread = function (fulfilled, rejected) { 
return this.all().then(function (array) { 
    return fulfilled.apply(void 0, array);//error occurs here 
}, rejected); 

};

ответ

1

В коде есть некоторые серьезные ошибки (и небольшая ошибка в Q, так как .all, очевидно, выполняет возврат не-массивов).

allне Обратный звонок. Его единственным аргументом является либо массив, либо обещание для массива. Его можно назвать либо как статический метод:

Q.all([…]) 

или в качестве метода на обещание (Обещание для массива):

Q([…]) .all() 

Теперь этот массив (там, где это происходит от) потребностей до содержат обещания - обещания, которые все будут ожидаться. Однако вы проходили число и функцию. Вы должны обернуть равное значение в обещании с Q(p1) (даже если это не является строгим), и вам нужно вызвать вашу функцию, чтобы она давала вам обещание (и если это действительно функция для функции, как вы говорите, вам нужно будет вызовите его дважды).

Если вы хотите дождаться guidRequest, вам понадобится функция обратного вызова - если хотите, или нет. Отметьте также, что Q.isPromise на guidRequest не нужно, просто попробуйте бросить его с помощью Q.

var v1=112; 
function f2(data){ 
    console.log(data); 
    return getFormDataWithDropdown(objtype,scenario); 
}; 

var guidRequest = Q(processGuidRequest()); 
guidRequest.then(function(guid) { 
    var p1 = Q(v1), 
     p2 = f2(guid); // promises here! 
    return Q.all([p1, p2]); 
}).spread(function(geoVal,formVal){ 
    console.log(geoVal); 
    console.log(formVal); 
}).done(); 

В качестве альтернативы, вы можете просто написали return [p1, p2], и они будут автоматически были ждали от spread.