2014-10-09 52 views
0

傳播我結合使用Q.allspread以便遷移2 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(); 

p1valuep2是一個函數,返回一個名爲getFormDataWithDropdown的function,它返回promisevalue,它基於一組鏈接的promise s的分辨率。但是,當我運行此代碼時,出現此錯誤:

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,你將需要一個回調函數 - 如果你想要或沒有。

另請注意,guidRequest上的Q.isPromise是不必要的,只需嘗試將其與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期待。