[英]Undefined arguments using async.apply inside of async.series
我在項目內部使用了異步庫,結果出現了一個奇怪的現象:我的某些參數在調用中“未定義”。
例如(這不是我的實際代碼,但是行為是相同的,以這種方式更容易暴露我的問題):
var token;
async.series([
function getToken (done) {
api.getToken(userId, function (err, data) {
if (err) return done(err);
token = data;
return done();
}
},
async.apply(doSomethingWithTheToken, token)
], callback);
調用我的函數“ doSomethingWithTheToken”時,即使我在先前的函數“ getToken”中將其更改為參數,傳遞的令牌也具有“未定義”的值。
但是如果我這樣做:
var token;
async.series([
function getToken (done) {
api.getToken(userId, function (err, data) {
if (err) return done(err);
token = data;
return done();
}
},
function doSomething (done) {
doSomethingWithTheToken(token, done);
}
], callback);
沒問題,在函數“ doSomethingWithTheToken”中傳遞的令牌具有上一個函數給出的正確值。
在寫這篇文章之前,我已經對async模塊做了一些研究,當我顯示傳遞給async.apply函數的參數時,會驚訝地發現它們在async.series流中進行任何函數調用之前就顯示了-這解釋了為什么我的令牌值是“未定義”。
有誰能解釋我為什么會發生這種現象?
我希望我對我的問題很清楚,謝謝
每當調用async.series時,它將在數組中准備其所有函數引用,在數組中添加getToken,然后調用async.apply,並在數組中添加生成的函數引用(async.apply的輸出)。
那時令牌是不確定的。
發生這種情況的場景如下:
> var i;
> var arr = [1,2,3,i,5,6];
> i=4;
> arr
[ 1, 2, 3, undefined, 5, 6 ]
希望你能理解。
如另一個答案中所述:目前async.apply
被稱為token
是undefined
。
但是,您可能希望研究async.waterfall
,它允許您將參數傳遞給序列中的下一個函數,從而可以執行以下操作:
async.waterfall([
function getToken (done) {
api.getToken(userId, function (err, data) {
if (err) return done(err);
return done(null, data);
});
},
function doSomething (token, done) {
doSomethingWithTheToken(token, done);
}
], callback);
實際上,您可以將其縮短為此(如果doSomethingWithTheToken
接受token
並作為參數done
):
async.waterfall([
function getToken (done) {
api.getToken(userId, done);
},
doSomethingWithTheToken
], callback);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.