var a = [[1,2,3],[4,5,6],[7,8,9]]
var b = []
const co = require('co');
new Promise(function(resolve, reject) {
a.forEach(function(item) {
item.forEach(function(it) {
setTimeout(function () {
b.push(it)
}, 1000);
})
})
// resolve(b)
}).then(function(data){
console.log(data);
})
// 主要是异步的问题还是怎么的,会直接返回b = [] 而不是期待的
// b = [1,2,3,4,5,6,7,8,9]
タイマーが実行される前に Promise がリゾルブ状態に変化し、then コールバックが実行されて b が出力されます。
その後、タイマーがタイムアウトし、データが b に配置されます。
解決は、タイマーを設定した直後に解決するのではなく、すべてのタイマーが期限切れになった後に実行する必要があります。
この Promise には解決または拒否がないため、常に保留状態となり、console.log に記録されません。したがって、解決行のコメントを解除するのを忘れたと思います。
Promise 内には、2 次元配列を横断するコードが含まれています。この 2 次元配列の各要素に対して、1 秒後に要素を b に追加するタイマーを設定します。タイマーを設定した後、Promise が最初に解決されます。まだ 1 秒に達しておらず、タイマーはまだ実行されておらず、b はまだ空の配列です。そして、解決したため、then が実行された後のステートメントが、発生した問題です。
しばらく(1秒後)待ってからaを出力すると、実際に望む結果が得られます。 1 秒後、設定されたタイマーがタイムアウトしてトリガーされ、要素が b にプッシュされます。
欲しい結果は次のように書く必要がありますか?
各タイマーで、私が 2 次元配列の最後のタイマーであれば解決します。それでおしまい。
非常にわかりにくい書き方になっているように感じますが、なぜ co があるのにそれを使用しないのですか?
要素を 1 秒ごとにプッシュしたい場合は、これを実行できます。