Javascript return 语句不会阻止其余函数的完成
Javascript return statement doesn't stop rest of function from completing
我正在使用 Docuware 的 API 将文档装订(合并)在一起。我把我的问题写得尽可能简单,所以没有 Docuware 知识的人应该能够理解。
所以在我的主函数中,我调用了另一个函数并检查了被调用函数的 return 值。如果该值等于零,它应该 return null - 意味着函数的其余部分不应该 运行.
const lastStored = await searchDocument("Invoice", ORDER_NUMBER = '', cookie)
console.log("Full id func: " + id)
console.log("id[0]: " + id[0])
if (lastStored[0] === 0) {
console.log("id[0]: " + id[0])
return null;
};
我的代码出现了奇怪的错误,所以我有很多 console.logs。这是代码成功运行时的 console.logs。
cookie set
Document is Invoice (Invoice)
Invoice order #: ORD83001
Current ID: 52724 Order #: ORD83001
cookie set
Document is DELIVERY SLIP (DELIVERY SLIP)
Invoice order #: ORD83001
DELIVERY SLIP Doc ID: 52553
Current ID: 52553 Order #: ORD83001
Full id func: 52553,ORD83001
id[0]: 52553
New Tray Doc ID: 1410
Document's successfully merged.
现在,由于错误,console.logs 是:
//.....
Current ID: 0 Order #: ORD83009
Full id func: 0,ORD83009
id[0]: 0
id[0]: 0
Document's successfully merged.
关于此错误的事情是,如果 id[0] 确实为零,则文档将无法合并。但是,如果我查看这些文件,它们就会合并。那么为什么我的代码 returning 为 0,即使在我的 if 语句中,却继续 运行?
这是某种时间问题吗?像 id[0] === 0 但 .00000001 秒后它会更新,所以 return null 不会跟进?
发生这种情况是因为在 return null
和“文档已成功合并”的输出部分之间有 await
。
每个 await
都是代码中的一个点,其中执行上下文 暂停 。根据等待的承诺,未来某个时间暂停的执行将再次 resumed。这可能会导致令人惊讶的输出序列。
下面是这个效果的简单演示。请注意 if
块中的输出是如何跟随其下方的输出的。得出 return
不知何故没有“起作用”的结论是错误的。它确实如此,但是这个函数的另一个执行被暂停(等待承诺解决)并恢复只是为了产生最终输出:
const something = i => new Promise(resolve => setTimeout(resolve, i * 1000));
async function demo(i) {
console.log("test the value of i");
if (i == 1) {
console.log("i is one, so we exit");
return null;
}
await something(i);
console.log("performed the action");
}
demo(0);
demo(1);
我正在使用 Docuware 的 API 将文档装订(合并)在一起。我把我的问题写得尽可能简单,所以没有 Docuware 知识的人应该能够理解。
所以在我的主函数中,我调用了另一个函数并检查了被调用函数的 return 值。如果该值等于零,它应该 return null - 意味着函数的其余部分不应该 运行.
const lastStored = await searchDocument("Invoice", ORDER_NUMBER = '', cookie)
console.log("Full id func: " + id)
console.log("id[0]: " + id[0])
if (lastStored[0] === 0) {
console.log("id[0]: " + id[0])
return null;
};
我的代码出现了奇怪的错误,所以我有很多 console.logs。这是代码成功运行时的 console.logs。
cookie set
Document is Invoice (Invoice)
Invoice order #: ORD83001
Current ID: 52724 Order #: ORD83001
cookie set
Document is DELIVERY SLIP (DELIVERY SLIP)
Invoice order #: ORD83001
DELIVERY SLIP Doc ID: 52553
Current ID: 52553 Order #: ORD83001
Full id func: 52553,ORD83001
id[0]: 52553
New Tray Doc ID: 1410
Document's successfully merged.
现在,由于错误,console.logs 是:
//.....
Current ID: 0 Order #: ORD83009
Full id func: 0,ORD83009
id[0]: 0
id[0]: 0
Document's successfully merged.
关于此错误的事情是,如果 id[0] 确实为零,则文档将无法合并。但是,如果我查看这些文件,它们就会合并。那么为什么我的代码 returning 为 0,即使在我的 if 语句中,却继续 运行?
这是某种时间问题吗?像 id[0] === 0 但 .00000001 秒后它会更新,所以 return null 不会跟进?
发生这种情况是因为在 return null
和“文档已成功合并”的输出部分之间有 await
。
每个 await
都是代码中的一个点,其中执行上下文 暂停 。根据等待的承诺,未来某个时间暂停的执行将再次 resumed。这可能会导致令人惊讶的输出序列。
下面是这个效果的简单演示。请注意 if
块中的输出是如何跟随其下方的输出的。得出 return
不知何故没有“起作用”的结论是错误的。它确实如此,但是这个函数的另一个执行被暂停(等待承诺解决)并恢复只是为了产生最终输出:
const something = i => new Promise(resolve => setTimeout(resolve, i * 1000));
async function demo(i) {
console.log("test the value of i");
if (i == 1) {
console.log("i is one, so we exit");
return null;
}
await something(i);
console.log("performed the action");
}
demo(0);
demo(1);