2016-04-05 14 views
1

私は非同期を実行したい配列の配列を持っています。をオンにします。AngularJSはスタックされた約束を処理します

for(var a in As){ 

    this.doSomething(a).then(function(result){ 
     for(var b in Bs){ 
      this.somthingElse(b).then(function(){console.log(result)}); 
     }     
    }) 
} 

これを強制的に同期させて処理するにはどうすればよいですか? Array.prototype.mapArray.prototype.reduceが見つかりましたが、AngularJSでは利用できないようですね。

+0

なぜ同期していますか?あなたは正確に何をしようとしていますか? – Phil

+0

何か他に、データをDBサーバーにプッシュしています。私は、非同期の約束を通して並行処理の競合を避けたい。 –

答えて

1

約束事の配列を作成し、$ q.all()を使用してすべての約定がすべて完了したときにそれを解決することができます。 [OK]をbluebirdを使用している場合

var promises = []; 
 
for(var a in As){ 
 
    promises.push(this.doSomething(a)); 
 
} 
 

 
$q.all(promises).then(function(result){ 
 
    for(var b in Bs){ 
 
    this.somthingElse(b).then(function(){console.log(result)}); 
 
    }     
 
})

0

、あなたはこのような何かを行うことができます。

function doSomething(v){ 
    return new Promise(function(fullfil, reject){ 
     setTimeout(function(){ 
     console.log(v); 
     fullfil(v); 
     },500); 
    }); 
}; 
var As = [[1,2],[3,4],[5,6]]; 
(function start(){ 
    return Promise.map(As, function(a) { 
     return doSomething(a).then(function(){ 
     return Promise.map(a, function(b) { 
        return doSomething(b); 
    }); 
    }); 
}); 
})(); 
1

を、私はあなたが同期のすべてを実行する方法を探していると思う - もしそうならあなたは次を持っています:

var As = ['A1', 'A2', 'A3']; 
var Bs = ['B1', 'B2', 'B3']; 

実行が 'A1'、 'B1'、 'B2'、 'B3'、 'A2'、 'B1' ...のようにしたい場合

これは間違いありませんか?

もしそうであれば、以下を使用することができる:

function start(){ 
    $log.log('start'); 
    As.reduce(function(promise, itemA){ 
    return promise.then(function(){ 
     return doSomething(itemA).then(startBs); 
    }); 
    }, $q.resolve()); 
} 

function startBs(){ 
    $log.log('start Bs'); 
    return Bs.reduce(function(promise, itemB){ 
    return promise.then(function(){ 
     return somethingElse(itemB); 
    }); 
    }, $q.resolve()); 
} 

サンプルplunker:https://plnkr.co/edit/fgiI3J2ylcW4FUXuXjIP?p=preview

+0

A1、A1.B1、A1.B2、A1.B3、A2、A2.B1、A2.B2、A2.B3 ...それぞれのAが異なるBリストを持っていると仮定して、 –

2

まず、AngularJSはangular.map又はangular.reduceArray.prototype.mapArray.prototype.reduce AngularJSとほぼ無関係であるが含まれていないいます。

最新のブラウザでは、mapreduceの配列機能をサポートしています。 angular.forEachは互換性のためです(IE8以前の場合)。 map/reduceを使用し、IE8以前をサポートしたい場合は、underscore.jsまたはlodashを試してください。

質問に戻ると、達成したいことに関する情報が不十分で、実際には変数AsBsとは何ですか?

のは、以下の仮定を作ってみましょう:

  1. AsBsは両方Asのすべてのmemeberのために適切なJavaScriptの配列
  2. ている、あなたは、それをdoSomethingにしたいそれが行われるまで待機し、その後、すべてのでsomthingElseを行いますメンバーがBsの場合は、doSomething
    • の結果をログに記録します。つまり、somthingElseAs.length * Bs.length回。
  3. 最初
    • を行う必要がありますどのAsメンバーこれはAsメンバーがすべてのBsの反復のために、あなたがいない、同様に一緒に
  4. 同時にを行うことでしょう意味気にしません最初に行われたケア

以下はコード、y

// We cannot bring 'this' into map function's scope, so assign it to 'self' 
var self = this; 
var promises = As.map(function(a){ 
    return self.doSomething(a).then(function(resultOfA){ 
     return $q.all(Bs.map(function(b){ 
      return self.somthingElse(b).then(function(resultOfB){ 
       console.log(resultOfA); 
       return resultOfB; // Not neccessary 
      }); 
     })) 
    }); 
}); 

// Now if you want to do something after all those iterations, do it here: 
$q.all(promises).then(function(){ 
    // do something after all 'As.length * Bs.length' iterations are done 
}); 

あなたは、彼らが非同期で実行されている暗示、resultOfAのコンソールログランダム系列に表示されます。OUは角の$qサービスが必要になります。後で使用するために実際の結果を取得したい場合は、代わりにこれを行うことができます。

// We cannot bring 'this' into map function's scope, so assign it to 'self' 
var self = this; 
var promises = As.map(function(a){ 
    return self.doSomething(a).then(function(resultOfA){ 
     return $q.all(Bs.map(self.somthingElse)).then(function(resultsOfB){ 
      return { 
       resultOfA: resultOfA, 
       resultsOfB: resultsOfB 
      }; 
     }); 
    }) 
}); 

// Now if you want to do something after all those iterations, do it here: 
$q.all(promises).then(function(resultsOfA){ 
    // do something after all 'As.length * Bs.length' iterations are done 
    console.log(resultsOfA); 
    // Output would be something like: 
    // [{ 
    // resultOfA: 'Result of A[0]', 
    // resultsOfB: ['Result of B[0]', 'Result of B[1]', 'Result of B[2]...'] 
    // }, { 
    // resultOfA: 'Result of A[1]', 
    // resultsOfB: ['Result of B[0]', 'Result of B[1]', 'Result of B[2]...'] 
    // }] 
}); 
関連する問題