2016-04-06 7 views
0

私のプロジェクトの中で非同期ライブラリを使用しています。私は奇妙な動作に陥ります。例えばasync.series内でasync.applyを使用した未定義引数

(これは私の実際のコードではありませんが、動作は同じであり、このように私の問題を公開する方が簡単です):私の機能「doSomethingWithTheTokenは」トークンが渡され、呼び出された

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

以前の関数 "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フローで関数呼び出しが行われる前に表示されていました - 私のトークンの値が「未定義」である理由を説明します。

誰も私にこの現象が起こっている理由を説明することはできますか?

が、私はそれが配列で入手トークンを追加し、私は私の問題を事前

答えて

1

呼ばasync.seriesが、それは、アレイ内のすべての関数参照のを準備するときはいつでも、 で おかげで明らかにされてきた願って、 は、非同期呼び出します。適用し、生成された関数参照(async.applyの出力)を配列に追加します。

その時、トークンは定義されていませんでした。このように、ここで起こって

シナリオ:

> var i; 

> var arr = [1,2,3,i,5,6]; 

> i=4; 

> arr 
[ 1, 2, 3, undefined, 5, 6 ] 

あなたがこれを理解してほしいです。

+0

おかげで、私は今理解し、それは私が単に流れところのこの種の内の「async.apply」を使用する方法を持っていないことを意味しますarguの値実行時に変更される可能性がありますか? – Orodan

1

他の回答に記載されているとおり: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); 

あなたはこれにそれを短縮することができます( doSomethingWithTheTokentokenやパラメータなどdone)を受け入れる場合:答えを

async.waterfall([ 
    function getToken (done) { 
     api.getToken(userId, done); 
    }, 
    doSomethingWithTheToken 
    ], callback); 
+0

答えをありがとう、私はasync.waterfallを知っているが、私の場合は本当に私のニーズ(実際のコードは、この例より複雑です)と私はasync.applyユーザーにコードをもっと見せたい明らかです。とにかく、私はポイントを持っている、迅速な答えのために再びありがとう。 – Orodan

関連する問題