【问题标题】:API should be either %100 synchronous or %100 asynchronous exampleAPI 应该是 %100 同步或 %100 异步示例
【发布时间】:2016-11-04 15:47:21
【问题描述】:

当我在学习 https://nodejs.org/api/process.html#process_process_nexttick_callback_arg 时,我陷入了困境。我在下面引用它:

API 要么 100% 同步要么 100% 非常重要 异步。考虑这个例子:

// WARNING!  DO NOT USE!  BAD UNSAFE HAZARD!    
function maybeSync(arg, cb) {     
    if (arg) {      
        cb();       
        return;       
    }

    fs.stat('file', cb);

此 API 很危险,因为在以下情况下:

maybeSync(true, () => {       
     foo();     
});     
bar();   

不清楚是先调用foo()还是bar()。

我不明白为什么不清楚是先调用 foo() 还是 bar()。因为 arg 是 true 并且可能同步函数同步工作。因此,我认为一切都是同步工作的,并且 foo() 将在 bar() 之前被调用。为什么在这种情况下不是这样?

以下方法要好得多:

function definitelyAsync(arg, cb) {       
    if (arg) {      
        process.nextTick(cb);       
        return;
    }

    fs.stat('file', cb);    
}

【问题讨论】:

标签: javascript node.js asynchronous synchronous


【解决方案1】:

执行不明确,因为fs.stat() 是异步的,并且最快在下一个滴答时执行,这意味着bar() 将始终在foo() 之前执行。

但是,通过引入if (arg) 子句,其中cb() 立即执行,那么foo() 将在bar() 之前执行 - 这是同步的。 因此,maybeSync() 在执行之前不知道arg 是什么,就无法预测。

definitelyAsync() 通过在if (arg) 分支内安排对cb() 的调用来强制始终异步执行,这将始终导致bar()foo() 之前执行,而不管arg 的值如何。

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多