API应该是%100同步或%100异步示例

时间:2016-07-02 09:56:50

标签: javascript node.js asynchronous synchronous

虽然我正在学习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是真的,并且可能同步功能同步工作。因此,一切都是同步工作的,foo()将在bar()之前调用,我想。为什么这种情况不适用于这种情况?

  

以下方法要好得多:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

definitelyAsync()强制始终执行异步执行,方法是在cb()分支内安排对if (arg)的调用,这将始终导致bar()foo()之前执行无论arg值如何。