在Javascript中的回调机制

问题描述:

我想了解JavaScript(typescript)中的回调机制。如果我有一个需要回调作为输入参数的函数,是否必须显式使用return语句将其与实际的回调实现形成调用代码或者我们可以简单地在被调用的代码中使用“回调”引用并自动调用代码回调代码在Javascript中的回调机制

代码样本(typecript)

// callback code being hooked up using return statement 
clear(collectionName: string, callback: any) { 
     this.getConnection((err, db) => { 
      if (!db) 
       return callback(err, null); 
      db.collection(collectionName).remove(); 
     }); 
    return callback(); 
    } 


// callback code being hooked up using reference to reserved callback keyword for automatic hook up with calling code 
clear(collectionName: string, callback: any) { 
     this.getConnection((err, db) => { 
      if (!db) 
       return callback(err, null); 
      db.collection(collectionName).remove({}, callback); 
     }); 
    } 
+0

如果'getConnection'是异步,第一示例将触发'callback' *之前*'除去'完成。 –

你并不需要返回勾搭,你可以简单地调用它像

clear(collectionName: string, callback: any) { 
     this.getConnection((err, db) => { 
      if (!db) 
       callback(err, null); 
      db.collection(collectionName).remove(); 
     }); 
    return callback(); 
    } 


// callback code being hooked up using reference to reserved callback keyword for automatic hook up with calling code 
clear(collectionName: string, callback: any) { 
     this.getConnection((err, db) => { 
      if (!db) 
       callback(err, null); 
      db.collection(collectionName).remove({}, callback); 
     }); 
    } 

编号功能是Javascript中的一等公民,因此您可以将它们用作常规变量并将它们全部传递出去。你只需要在适当的时候给他们打电话(如普通功能)。无需返回声明。例如看看Array.prototype.forEach如何工作。它接受回调为获得当前迭代元件作为第一个参数,当前索引作为第二个参数的参数:

Array.prototype.forEach = function(callback) { 
    for(i = 0; i < this.length; i++) { 
    if (callback) callback(this[i], i) 
    } 
}