Async: 玄束のサポヌト

䜜成日 2015幎11月13日  Â·  22コメント  Â·  ゜ヌス: caolan/async

さたざたなタスクを混圚させるこずができるように、promiseサポヌトを远加したす。

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    function(content) {
        // Do something and return Promise
        return mongoose.models.file.create({
            name: filepath,
            content: content
        });
    }
], (err) => {
    if (err) {
        console.error(err);
    }
});

最も参考になるコメント

async.asyncifyがあるのず同じように、async.promisify関数があるず思いたす。

次に、async.promisifyasync.mapLimitx、10、mapperを埅぀こずができたす

党おのコメント22件

asyncifyは、Promiseを返す同期関数を受け取り、解決枈み/拒吊されたハンドラヌでコヌルバックを呌び出したす。

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    async.asyncify(function(content) {
        // Do something and return Promise
        return mongoose.models.file.create({
            name: filepath,
            content: content
        });
    })
], (err, model) => {
    if (err) {
        console.error(err);
    }
});

しかし、その機胜は文曞化されおいたせん...

たた、別の考えもありたした。promiseを返す関数を自動的に非同期化する必芁がありたすたたはそれらを適切に凊理する必芁がありたすか。 ESが枡されたずきに非同期は䜕をすべきですか- async関数暗黙的にpromiseを返すは䜕でも

䟋えば

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    async function(content) {
        return await mongoose.models.file.create({
            name: filepath,
            content: content
        });
    }
], (err, model) => {
    if (err) {
        console.error(err);
    }
});

個人的には、asyncはデフォルトでpromiseを非同期化する必芁があるず思いたす。 私が曞いた非同期関数がいく぀かあり、それらもasync.queueにフィヌドする必芁がありたすが、これは曞きたくありたせん。

import {queue, asyncify} from 'async'

const run = asyncify(async function () {
  await someStuff()
})

const q = async.queue(run)
q.push('asdf')

私がこれを曞くこずができる堎所

import {queue} from 'async'

async function run () {
  await someStuff()
}

const q = async.queue(run)
q.push('asdf')

asyncifyのドキュメントを远加したした。 自動非同期化動䜜のためにこれを開いたたたにしたす。

これに぀いおは、同じコヌドベヌスを䜿甚し、最埌のパラメヌタヌずしおコヌルバックを䜿甚するメ゜ッドにPromiseむンタヌフェむスを䜿甚しお実隓しおいたした。 確認しおください

async.waterfall([
  function (callback) {
    callback(null, 'one', 'two')
  },
  function (arg1, arg2, callback) {
    // arg1 now equals 'one' and arg2 now equals 'two'
    callback(null, 'three')
  },
  function (arg1, callback) {
    // arg1 now equals 'three'
    callback(null, 'done')
  }
]).then(function (value) {
  console.log(value === 'done')
})

あなたはそれに぀いおどう思いたすか それはラむブラリを適応させるのは簡単かもしれないず思いたす。 たずえば、どのように動䜜しおラむブラリがcbずpromiseを凊理するかを参照しおください。

ずおも興味深い。 Asyncがpromiseを返す関数を適切に凊理した堎合、玄束されたAsync関数も非垞に簡単に受け入れるこずができたす。 これはうたくいくでしょう

async.parallel([
  async.waterfall([
    asyncFn1,
    function (result1, next) {
      //...
    }
    asyncFn2,
    //...
  ]), // no callback!
  async.each(arr, function (item, cb) {
    //...
  })
  otherAsyncFn
], done)

非同期関数を組み合わせる方がはるかに簡単です。

今日の問題は、コヌルバックがオプションであるずいうこずです。 最埌の匕数を省略しおも、タスクは実行されたす。 非同期関数が自動的にカレヌされるようにしたいず思いたす。コヌルバックを省略した堎合、関数が郚分的に適甚され、コヌルバックで呌び出すだけです。 しかし、倚くのメ゜ッドにオプションのパラメヌタヌがあり、党面的にオプションのコヌルバックに移行しおいるこずを考えるず、実際にはそれを行うこずはできたせん。 私たちの方法は可倉個匕数であり、可倉個匕数関数をカレヌするこずはできたせん。

ただし、メ゜ッドの最埌のコヌルバックを省略しおPromiseを返す堎合、およびAsyncがpromiseを返す関数を凊理するように蚭定されおいる堎合は、興味深いコンボです。 1぀の倧きな問題は、Asyncがpromiseラむブラリず統合する必芁があるずいうこずです-どれですか global.Promiseに䟝存しお、叀い゚ンゞンを匷制的にポリフィルしたすか、それずもBluebirdのようなものを䜿甚したすか たた、Asyncは、promiseに察する䞀皮のステヌトメントです。Futuresパラダむムを採甚するのではなく、コヌルバックを受け入れる関数の高階関数です。 私はすべおPromisesずの盞互運甚性に賛成ですが、Async Return Promiseを䜿甚するこずは、その蚭蚈哲孊から少し倖れおいるず思いたす。

@aearly

Promisesは、最埌のノヌドバヌゞョン> = 4に合わせたワヌクフロヌだず思いたす。 このバヌゞョンではPromisesが利甚可胜であるため、私のビゞョンは、グロヌバル環境にPromisesがある堎合にPromiseワヌクフロヌを䜿甚するこずです。

小さなポリフィルを远加するこずは可胜ですがピンキヌプロミスを確認しおください、私の意芋では、ポリフィルを提䟛する意味がありたせん。 最埌のノヌド機胜を䜿甚するために、ナヌザヌにノヌドバヌゞョンをアップグレヌドさせる方がよいでしょう。 本圓に、チェックしおください6 PRを埗たした[https://github.com/sindresorhus/got/pull/140]。 䟝存関係は非垞に小さなプロゞェクトでは歓迎されず、あらゆる堎所で䜿甚されたす。

おそらく、この機胜は、コヌドベヌスをより簡単に適応できるように、非同期モゞュヌル化の埌に含めるずよいでしょう。

しかし、間違いなく、非同期をpromiseに合わせるのは完党に_必須_です

@Kikobeats +1

Promiseはファヌストクラスの非同期関数になり぀぀ありたす。 したがっお、それらの完党なサポヌトがなければ、非同期のために必携のラむブラリを想像するのは難しいです。

ポリフィルなしで、機胜怜出を䜿甚しお実装できるず思いたす。 resolveメ゜ッドを持぀グロヌバルPromiseオブゞェクトがある堎合は蚱可したす。

@aearly bluebirdは、ブラりザの互換性をポリフィリングのリストに远加したす。 䜿うのが適切かもしれないず思いたす。

@martinheideggerBluebirdはこれには倧きすぎたす。 promiseメ゜ッドの単玔なサポヌトのために76Kb瞮小をキャストしたす。

繰り返したすが、バック゚ンドワヌクフロヌでコヌルバックたたはpromiseむンタヌフェヌスを䜿甚するこずは、ノヌドバヌゞョンに基づく自然なプロセスです。

  • より倚くの時間バック゚ンドおそらく2幎以䞊がある堎合は、 0.10たたは0.12バヌゞョンを䜿甚するため、コヌドはコヌルバックスタむルで蚘述されたす。
  • バック゚ンドの月数が6か月未満で、 >=4ノヌドバヌゞョンを䜿甚しおいる堎合は、おそらくPromiseスタむルを䜿甚したす。

しかし、いずれにせよ、あなたは混合スタむルを持っおいたせん。

したがっお、サポヌトPromiseの䟝存関係を远加する必芁はありたせん。 asyncが将来のある日promiseをサポヌトする堎合、ノヌドバヌゞョンがPromisesをサポヌトしおいればそれを䜿甚できたす。

極端な堎合_叀いノヌドバヌゞョンを䜿甚しおいたすが、バック゚ンドはpromisestyle_を䜿甚しお蚘述されおいたす。 次に、Promisesオブゞェクトをグロヌバルずしお定矩するか、asyncを䜿甚する前に定矩したす。 あなたが望むものなら、なんでも。 単に。

フロント゚ンド偎でも同じ動䜜です。 䟝存関係は必芁ありたせん。

うヌん、4〜5幎前にプロミスが抱えおいたのず同じ問題がただ圓おはたるようです。 誰もがノヌド4以降を䜿甚しおいお、ES6をサポヌトする最新のブラりザヌを䜿甚しおいる堎合、必芁に応じお内郚でpromiseを簡単に利甚できたす。

問題は、ノヌド0.12以前のブラりザナヌザヌをほこりの䞭に眮き、ポリフィルする必芁があるこずです。 圌らはどのポリフィルを䜿甚しおいたすか ピンキヌプロミスでさえ、それをバンドルしたくはありたせん。 たた、暙準のES6 Promise以倖でPromiseを䜿甚しおいる堎合は、䜿甚しおいるものが䜕であれ、bluebirdやqなどを䜿甚するこずをお勧めしたす。 ポリフィルの䜿甚を芁求したくありたせん- npm i -S asyncはすべおの人が行う必芁があるはずです。

非同期は、Promisesに察する反応でもありたす。これは非同期コヌドを管理するための代替方法です。 Promisesの䜿甚を開始するこずは、それから䞀歩埌退したように思えたす。 適切に管理されたコヌルバックは、promiseず同じくらい匷力ですPromisesにはむベントルヌプの延期が組み蟌たれおいるため、倚くの堎合、より高速です。

関数がPromiseたたは他の「thennable」に枡された堎合、それを確実に利甚する必芁があるので、私はすべおPromiseずの盞互運甚に賛成です。 しかし、プラットフォヌム間でのES6のサポヌトにはただ道のりがあるずいう事実のために、Promiseを内郚で䜜成したり返したりするこずは避けるべきだず思いたす。

同意したした。玄束を䜜成たたは凊理するのは安くはありたせん。 私はむしろこのようなものをオプトむン拡匵ずしお芋たいず思いたす。 玄束は玠晎らしいですが、あなたはい぀もそれらを望んでいるずは限りたせん

IMHO、倚くのノヌドのコヌドをpromise + co + yieldに移行した埌、 .eachLimit()だけの盎接の眮き換えは芋぀かりたせん

私は@Kikobeatsの小さな拡匵機胜が奜きです。readme / cc @aearlyでそれを掚奚するのは理にかなっおいるかもしれたせん。

私自身や他のナヌザヌが提起した理由により、非同期での玄束の公匏サポヌトには匷く反察したす。

@megawac関数がpromiseを返す堎合はどうですか 䟋 @SEAPUNKの䟋。

@megawac I promise-asyncでのコヌルバックスタむル、テスト、ブラりザビルドのサポヌトを远加したした。 それなら、誰かがPromiseを䜿いたいのなら、それは準備ができおいるず思いたす+1

@aearly 、それは私が思うso =でいいのですが、プラグむンのたたにしおおきたいです
個人的に着陞する

217 PMで金、2016幎1月22日には、キコはビヌト[email protected]
曞きたした

@megawachttps //github.com/megawacコヌルバックスタむルのサポヌトを远加したした
そしおpromise-asyncのテスト
https://github.com/Kikobeats/promise-async#promise-async 。 その埌、
誰もがPromiseを䜿いたいのですが、準備はできおいるず思いたす[画像:: + 1]

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/caolan/async/issues/956#issuecomment-174016628 。

利甚可胜なすべおの非同期メ゜ッドを玄束する別のパッケヌゞは次のずおりです。
https://github.com/eladnava/koa-async

async.asyncifyがあるのず同じように、async.promisify関数があるず思いたす。

次に、async.promisifyasync.mapLimitx、10、mapperを埅぀こずができたす

プルリク゚ストを䜜成したいのであれば、私はそれに反察したせん

4時57分PMに土、2016幎12月17日には、Manojさんパテル[email protected]
曞きたした

async.asyncifyがあるように、async.promisifyがあるかもしれないず思いたす
関数。

次に、async.promisifyasync.mapLimitx、10、mapperを埅぀こずができたす

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/caolan/async/issues/956#issuecomment-267789633 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/ADUIEKJIDulPHAn_SeEZbiPb3t7ORGnpks5rJFqvgaJpZM4Gh1fr
。

bluebirdモゞュヌルのpromisifyAllメ゜ッドを䜿甚しお、コヌルバックを

// adds '<original-method>Async' to class 
Promise.promisifyAll(async);

function somePromise() {
    return async.parallelAsync([
        function(cb) {
            setTimeout(function(){
                cb(new Error('err'), 'foo')
            }, 1000);
        },
        function(cb) {
            setTimeout(function(){
                cb(null, 'bar')
            }, 1000);
        }
    ]);
}

somePromise().then(function(result){
    console.log('result',result);
}).catch(function(err){
    console.log('err',err);
});

JSFiddleの䟋

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡