我尝试使用print i
的承诺加载一堆资源异步。加载代码是一个试图将其全部链接的灾难,我需要一个更清洁的解决方案。
我想出的是下面的内容。这显然没有做任何事情,因为它是垃圾代码,但我需要知道加载任何资源是否有失败,我需要知道它们何时完成。
Jimp.js
出于某种原因,这绝不会输出"糟糕" 。
这是一个失败的输出:
[' SUCCESS',' 1',0.756461151774289] 空
我在这里缺少什么?
更新
我接受了我收到的一部分答案并对其进行了更改,以使其完全符合我的要求:
function doSomething(asdf) {
return new Promise((resolve, reject) => {
//console.log("It is done.");
// Succeed half of the time.
var x = Math.random();
if (x > .5) {
resolve(["SUCCESS",asdf,x])
} else {
reject(["Failure",asdf,x])
}
});
}
func();
function func() {
//Imagine a is actually an image loaded by doSomething
var a=null; doSomething("1").then(function (data) {a = data;},
(err) => {throw new err;});
//Imagine b is a font resource.
var b=null; doSomething("2").then(function (data) {b = data;},
(err) => {throw new err;});
Promise.all([a, b]).then(function() {
console.log(a);
console.log(b);
//Then here I expect everything to be correct, and continue on with the next function.
},
(err) => {console.log('Oops:' + err);}).
catch( (err) => {console.log('Oops:' + err);});
}
更新
以下是我现在正在使用的实际代码:
function func() {
var a=doSomething("1").then(function (data) {a = data;});
var b=doSomething("2").then(function (data) {b = data;});
Promise.all([a, b]).then(function() {
console.log(a);
console.log(b);
},
(err) => {console.log('Reject:' + err);});
}
答案 0 :(得分:2)
您无法将这些a
和b
变量用于图片。 (有关将传递到Promise.all
的值),请参阅here。您需要为doSomething()
返回的promise对象使用变量。这些图片只能在then
回调中使用 - Promise.all
会创建一个符合结果数组的承诺:
function func() {
// aPromise is a promise for an image loaded by doSomething
var aPromise = doSomething("1");
// bPromise is a promise for a font resource.
var bPromise = doSomething("2");
Promise.all([aPromise, bPromise]).then(function([a, b]) {
// ^^^^^^
console.log(a);
console.log(b);
// Then here I expect everything to be correct, and continue on with the next function.
}, (err) => {
console.log('Oops:' + err);})
});
}
答案 1 :(得分:1)
Promise.all([a, b])
因为您将a
设置为b
,因此null
和null
为a
。因此,Promise.all将不会等待,它将在之后解决一个滴答,并且b
和a
得到快速解决/拒绝,这可能发生在b
/之前 console.log(a)
在到达
"echo 'Installing docker",
"sudo groupadd docker",
"sudo usermod -aG docker {{user `service_user`}}",
"sudo usermod -aG docker {{user `config_user`}}",
"newgrp docker",
"echo 'Install docker-compose",
将记录正确的结果有时,但这基于偶然。
答案 2 :(得分:1)
Promise.all返回一个承诺,此承诺包含先前承诺的结果
Promise.all([ doSomething('1'), doSomething('2')])
.then(results => {
// results is an array which contains the result of the previous promises
const [a, b] = results
}).catch(err => console.log('Oops:' + err))