会在 promise 循环中解决 break 循环迭代吗?
Will resolve in promise loop break loop iteration?
我在这样的循环中调用异步函数(类似于上传文件列表):
return new Promise(async function(resolve, reject) {
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) {
resolve({error: "Something goes wrong"});
// break; - is this required?
}
}
}
async function myAsyncFunction() {
return new Promise(async function(resolve, reject) {
resolve code....
}
}
如果在一个同样在我调用的承诺中的循环中,resolve()
将循环继续迭代,否则它将停止。
如果我在那之前解决,基本上我需要在循环中调用 break;
吗?
Will resolve in promise loop break loop iteration?
不,不会。如果你想打破循环,你必须使用 break
或 return
.
但作为一个单独的东西,还有一些其他问题:
没有理由在该代码中使用 new Promise
。 async
函数 return 承诺,无需包装它们。
将错误标志与解决方案一起使用通常不是最佳做法。使用 rejection 表示失败,而不是 fulfillment 并带有错误代码。
所以:
return (async function(resolve, reject) {
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) { // I'd use `if (!response.ok) {`
throw new Error("something goes wrong");
}
}
// Presumably return something here
})();
(这看起来有点尴尬。如果您提供更多上下文,可能会使其看起来不那么尴尬。)
同样,myAsyncFunction
A) 不应该是 async
函数,或者 B) 不应该使用 new Promise
。参见 What is the explicit promise construction antipattern and how do I avoid it?
最后,这个值得怀疑:
let response = await myAsyncFunction();
if (response.ok === false) { // I'd use `if (!response.ok) {`
throw new Error("something goes wrong");
}
除非有非常 充分的理由,myAsyncFunction
应该在出现问题时拒绝而不是履行它的承诺。 (成千上万的错误代码示例使用 fetch
而不检查 response.ok
就是证明。)
不要同时使用 Promise 构造器和 async function
。那只会引起像这样的头痛。只要使用一个异步函数,那么很明显你实际上可以 return
:
return (async function() { // IIFE is all you need, will result in a Promise itself
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) {
return {error: "Something goes wrong"};
}
}
})();
Read on
Resolve 将打破循环甚至嵌套循环,正如我从这段代码中看到的:
function loops() {
return new Promise((resolve, reject) => {
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
if (j === 1) {
resolve("first");
}
if (j === 5) {
resolve("second");
}
}
}
resolve("third");
});
}
async function execute() {
let test = await loops();
console.log(test);
}
execute();
我在这样的循环中调用异步函数(类似于上传文件列表):
return new Promise(async function(resolve, reject) {
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) {
resolve({error: "Something goes wrong"});
// break; - is this required?
}
}
}
async function myAsyncFunction() {
return new Promise(async function(resolve, reject) {
resolve code....
}
}
如果在一个同样在我调用的承诺中的循环中,resolve()
将循环继续迭代,否则它将停止。
如果我在那之前解决,基本上我需要在循环中调用 break;
吗?
Will resolve in promise loop break loop iteration?
不,不会。如果你想打破循环,你必须使用 break
或 return
.
但作为一个单独的东西,还有一些其他问题:
没有理由在该代码中使用
new Promise
。async
函数 return 承诺,无需包装它们。将错误标志与解决方案一起使用通常不是最佳做法。使用 rejection 表示失败,而不是 fulfillment 并带有错误代码。
所以:
return (async function(resolve, reject) {
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) { // I'd use `if (!response.ok) {`
throw new Error("something goes wrong");
}
}
// Presumably return something here
})();
(这看起来有点尴尬。如果您提供更多上下文,可能会使其看起来不那么尴尬。)
同样,myAsyncFunction
A) 不应该是 async
函数,或者 B) 不应该使用 new Promise
。参见 What is the explicit promise construction antipattern and how do I avoid it?
最后,这个值得怀疑:
let response = await myAsyncFunction();
if (response.ok === false) { // I'd use `if (!response.ok) {`
throw new Error("something goes wrong");
}
除非有非常 充分的理由,myAsyncFunction
应该在出现问题时拒绝而不是履行它的承诺。 (成千上万的错误代码示例使用 fetch
而不检查 response.ok
就是证明。)
不要同时使用 Promise 构造器和 async function
。那只会引起像这样的头痛。只要使用一个异步函数,那么很明显你实际上可以 return
:
return (async function() { // IIFE is all you need, will result in a Promise itself
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) {
return {error: "Something goes wrong"};
}
}
})();
Read on
Resolve 将打破循环甚至嵌套循环,正如我从这段代码中看到的:
function loops() {
return new Promise((resolve, reject) => {
for (let i = 0; i < 10; i++) {
for (let j = 0; j < 10; j++) {
if (j === 1) {
resolve("first");
}
if (j === 5) {
resolve("second");
}
}
}
resolve("third");
});
}
async function execute() {
let test = await loops();
console.log(test);
}
execute();