簡體   English   中英

在async.series內部使用async.apply的未定義參數

[英]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被稱為tokenundefined

但是,您可能希望研究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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM