Nodejs: setTimeout

Phương thức setTimeout() đặt bộ hẹn giờ thực thi một chức năng hoặc đoạn mã nào đó sau khi thời gian đặt trước đã trôi qua.

setTimeout(code)
setTimeout(code, delay)

setTimeout(functionRef)
setTimeout(functionRef, delay)
setTimeout(functionRef, delay, param1)
setTimeout(functionRef, delay, param1, param2)
setTimeout(functionRef, delay, param1, param2, /* … ,*/ paramN)

Phương thức đơn giản này chỉ có chút rắc rối khi dùng từ khóa this.

Nếu trong thân hàm functionRef như trên có chứa từ khóa this thì tùy ngữ cảnh this tham chiếu đến các đối tượng khác nhau.

myArray = ['one', 'two', three']

// this tham chiếu đến myArray
myArray.myMethod = function (sProperty) {
  console.log(arguments.length > 0 ? this[sProperty] : this);
};

// this tham chiếu đến "[object Window]"
setTimeout(myArray.myMethod, 1.0*1000);


// this tham chiếu đến "undefined"
setTimeout(myArray.myMethod, 1.5*1000, '1');\

// error
setTimeout.call(myArray, myArray.myMethod, 2.0*1000);
setTimeout.call(myArray, myArray.myMethod, 2.5*1000, 2);

Hai cách tránh hiểu lầm:

1. Bọc phương thức trong hàm mới

// in ra "zero,one,two"
setTimeout(() => {myArray.myMethod()}, 2.0 * 1000);


// in ra "one"
setTimeout(() => {myArray.myMethod('1')}, 2.5 * 1000);

2. Hoặc dùng bind để chỉ rõ this tham chiếu đến đối tượng nào

const myBoundMethod = (function (sProperty) {
    console.log(arguments.length > 0 ? this[sProperty] : this);
}).bind(myArray);

// hay dùng trực tiếp không qua bound method
setTimeout(myArray.myMethod.bind(myArray), 1.0*1000);

// gọi phương thức trong class
setTimeout(this.myMethod.bind(this), 1000);

Comments Off on Nodejs: setTimeout

Filed under Software

Comments are closed.