私は今、次のコードを持っている:約束しているコールバックからデータを取得しますか?
const Promise = require('bluebird');
const readFile = Promise.promisify(fs.readFile);
recordPerfMetrics: function(url) {
var self = this;
var perf, loadTime, domInteractive, firstPaint;
var perfData = {};
readFile('urls.txt', 'UTF-8').then(function (urls, err) {
if (err) {
return console.log(err);
}
var urls = urls.split("\n");
urls.shift();
urls.forEach(function(url) {
console.log(url);
self.getStats(url).then(function(data) {
data = data[0];
loadTime = (data.loadEventEnd - data.navigationStart)/1000 + ' sec';
firstPaint = data.firstPaint;
domInteractive = (data.domInteractive - data.navigationStart)/1000 + ' sec';
perfData = {
'URL' : url,
'firstPaint' : firstPaint,
'loadTime' : loadTime,
'domInteractive' : domInteractive
};
console.log(perfData);
}).catch(function(error) {
console.log(error);
});
});
// console.log(colors.magenta("Starting to record performance metrics for " + url));
// this.storePerfMetrics();
});
},
getStats: function(url) {
return new Promise(function(resolve, reject){
console.log("Getting data for url: ",url);
browserPerf(url, function(error, data) {
console.log("inside browserPerf", url);
if (!error) {
resolve(data);
} else {
reject(error);
}
}, {
selenium: 'http://localhost:4444/wd/hub',
browsers: ['chrome']
});
});
},
これは基本的にファイルからURLを読み込み、その後、そのデータが返されるコールバック関数である関数browserPerfを呼び出しています。
console.log("Getting data for url: ",url);
は、ファイルに格納されたURLと同じ順序である
しかしconsole.log("inside browserPerf", url);
は同じとして、予想されるような組み合わせではありません。私は、URLの順序があることを期待
:
console.log(url);
console.log("Getting data for url: ",url);
console.log("inside browserPerf", url);
しかし、最初の2つだけの理由では、順番に実行されているが、すべてが読まれた後に三つがランダムに発射されます。 私はここで間違って何を考えている?
あなたの '.forEach()'ループは同期して実行されます。内部の非同期操作はすべて一度に開始され、 '.forEach()'ループを無視して終了します。複数の約束が完了したときに調整したい場合は、それらを順番に実行するようにシーケンスするか、 'Promise.all()'を使用してすべての完了が通知されるようにします。これらのオプションのいずれかを実行する方法を説明する何百もの質問/回答があります。 – jfriend00
また、Bluebirdを使用しているので、 '.forEach()'をBluebirdのマップ関数に置き換えてみてください。並行処理オプションも良いです。 – Keith
URLを順番に並べ替えるか、すべての情報を並行して取得して、いつ準備が整ったのかを知りたいですか? – jfriend00