在 javascript 中等待 Promise.all.then 之后如何调用代码?



考虑示例:

.js

"use strict";
const input = [
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru"
];
const createPhantomPool = require('phantom-pool');
(async function() {
console.log("start");
const pool = createPhantomPool({max: input.length*2, min: input.length*2});
let promises = [];
input.forEach(url => promises.push(pool.use(async (instance) => {
instance.createPage()
.then(page => {
return page.open(url);
}).then(() => console.log("load finished"))
.catch(error => {
console.log(error);
});
})));
await (Promise.all(promises).then(() => console.log("after then")));
console.log("end");
}());

包.json

"dependencies": {
"aws-sdk": "^2.68.0",
"es6-promise": "^4.1.0",
"log4js": "^1.1.1",
"moment-timezone": "^0.5.13",
"phantomjs": "^2.1.7",
"webpage": "^0.3.0"

我希望所有承诺都会完成,只有在那个console.log("after then")被召唤之后。但是这个例子给了我以下输出:

start
after then
end
load finished
load finished
load finished
load finished
load finished

为什么after thenload finished???之前打印

你需要从instance.createPage()await承诺pool.use

"use strict";
const input = [
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru",
"https://www.google.ru"
];
const createPhantomPool = require('phantom-pool');
(async function() {
console.log("start");
const pool = createPhantomPool({max: input.length*2, min: input.length*2});
let promises = [];
input.forEach(url => promises.push(pool.use(async (instance) => {
await instance.createPage()
.then(page => {
return page.open(url);
}).then(() => console.log("load finished"))
.catch(error => {
console.log(error);
});
})));
await (Promise.all(promises).then(() => console.log("after then")));
console.log("end");
}());

这已经过测试。正在发生的事情是pool.use没有等待instance.createPage()的承诺来解决。你要么必须return承诺,要么await承诺。您已经将它的包装器作为async函数,因此不妨保持一致并await它。

最新更新