2

変数を変更するループ内でコールバックを待ちながら、まだ非同期性を使用するにはどうすればよいですか?

2 番目の例は async を使用しています。この場合、グローバル var を回避するために に2 番目のパラメータsumを追加する方法がわかりません。戻り値と同様に呼び出されますwaitsumwait(sum,value);sum

waitは、実際の問題で使用する複雑な関数の表現であるため、「インライン」コードに書き直すことはできず、「関数」のままにする必要があります。

例1:

var _ = require('underscore');
var arr = [1,2,3,4,5,6,7];
var sum = 0;

function wait(item,callback) {
  setTimeout(function() {
    callback(item);
  }, Math.ceil(Math.random()*1000));
}

var done = _.after(arr.length,function(value) {
  console.log('sum ='+value);
})

_.each(arr,function(itm) {
  wait(itm,function(value) {
    console.log('waiting... '+value);
    sum = sum + value;
  })
 // Please wait for the callback
  console.log(itm);
  done(sum);
});

例 2:

function asyncExample2() {
var async = require('async');
var arr = [1,2,3,4,5,6,7];

function otherWait(item, callback) {
    setTimeout(function() {
    callback(item); // call this when you're done with whatever you're doing
  }, Math.ceil(Math.random()*1000));
}

function wait(item, callback) {
  setTimeout(function() {
    otherWait(item,function() {
    console.log(item);
  });
  callback(item); 
  }, Math.ceil(Math.random()*1000));
}

function done() { console.log("sum = "+sum);};

var sum = 0;
async.forEach(arr, wait, done);
}

ご希望の電話番号:

sum = wait(sum,item) 
4

4 に答える 4

4

doneこれを行う最も簡単な方法は、関数を入れることwaitです。done最後が実行された後にのみ呼び出されcallbackます。

var arr = [1,2,3,4,5,6,7];
var sum = 0;

function wait(item,callback) {
  setTimeout(function() {
    callback(item);
    done(sum);
  }, Math.ceil(Math.random()*1000));
}

var done = _.after(arr.length,function(value) {
  console.log('sum ='+value);
})

_.each(arr,function(itm) {
  wait(itm,function(value) {
    console.log('waiting... '+value);
    sum = sum + value;
  })
  // Please wait for the callback
  console.log(itm);
  //done(sum);
});

出力:

ここに画像の説明を入力

于 2013-10-12T05:04:40.930 に答える
2

アンダースコアは完全に同期的であるため、実行が完了するdone(sum)前に実行されます。wait非同期操作ではアンダースコアを使用しないでください。

このような単純なものは、あなたが望むことをするはずです:

var sum = 0;
var waitNext = function(pos) {
    wait(arr[pos], function(value)) {
        if(pos < arr.length)
        {
            console.log('waiting... '+value);
            sum += value;
            waitNext(pos+1);
        }
        else
        {
            done(sum);
        }
    }
}
waitNext(0);

もちろん、使用を避けてwaitNext変更することもできますがwait、これがコードでない場合waitは機能します。if 条件の順序を微調整することで削除できるsum += value不要な呼び出しがあるため、if 内またはその直前のどちらが必要かはわかりません。waitNext

于 2013-10-11T10:39:52.373 に答える