我在Firefox中打开了开发人员控制台,并且必须遵守一些承诺。我真的很喜欢一些阻塞语法,它们只会等待promise解决并直接返回结果。现在我必须要做类似的事情:
var result; promise.then((res) => { result = res})
每一次我真的很累。我尝试过这样的事情:
resolve = function(promise) { var res; var done = false; promise.then(r => {res = r; done = true}); while(!done) {}; return res; }
但是它永远卡住了。有什么东西吗?如何轻松获得结果?
编辑:首先,我不处理Node环境或某些JS脚本。我知道那里该如何处理。我正在使用Fixrefox开发工具控制台,并且正在寻找一些简单的方法来等待承诺解决。我知道我可以做IIFE。可以针对一个或两个诺言来做到这一点,但不能仅仅针对其中的十个诺言而做,因为那是很多代码。我想要类似的东西:
function = resolvePromise(promise) { ... };
只会阻塞直到承诺被解决并返回已解决的值。这样我就可以简单地将其用作:
var result = resolvePromise(promise); // result now holds the actual value
它不必一定是功能,可以是一些技巧,因为它不会在脚本或Node中使用,而只会在开发工具中使用。在控制台中为每个承诺编写IIFE只是可怕的人体工程学。
Edit2:@Andy建议使用Promise.all,但是由于我没有同时拥有所有的承诺,所以这不是一个选择。基本上,我在REPL中,我需要一个简单易行的方法来评估,检查/存储/确定下一步要执行的操作,然后重复执行。我不能一直写IIFE
谢谢
答案 0 :(得分:0)
// Mock fetch function to return data
// after 2s
function fetch() {
const n = Math.floor(Math.random() * (100 - 1) + 1);
return new Promise(resolve => {
setTimeout(() => resolve(n), 1000);
});
}
// Push a load of promises into an array
const arr = [];
for (let i = 0; i < 20; i++) {
arr.push(fetch());
}
// async immediately-invoked function expression.
// `Promise.all` gathers up all the results of all
// the promises in the array and returns its own promise
// and `await` pauses until that promise resolves
(async () => {
console.log('Please wait for the result');
const result = await Promise.all(arr);
console.log(result);
})();