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);