Thông thường nếu bạn không sử dụng những lời hứa, bạn có thể dễ dàng làmRàng buộc 'this` phạm vi của một hàm callback lời hứa
var a = function(cb){
setTimeout(function(){
var boundCb = cb.bind({hello: 'world'});
boundCb();
}, 100);
};
a(function(){
alert(this.hello);
});
mà không phải là đặc biệt hữu ích nhất của thời đại (như bạn có thể vượt qua cùng những thứ như các đối số bình thường), nhưng nó cho phép một số mã cực kỳ dễ đọc và/hoặc đơn giản để sử dụng các giao diện.
Khi chuyển sang lời hứa tuy nhiên nó đột nhiên trở nên khó khăn hơn nhiều để thực hiện. Gì ngạc nhiên các sau không công việc (như resolve
không phải là một tài liệu tham khảo trực tiếp)
var a = function(){
return new Promise(function(resolve, reject){
var boundResolve = resolve.bind({hello: 'word'});
boundResolve();
});
};
a().then(function(){
alert(this.hello)
});
như vậy là có cách nào ở tất cả để đạt được điều này?
postscriptum không cần thiết: 'May mắn' trong hoàn cảnh của tôi phạm vi this
Tôi muốn thiết là đã giống như những gì phạm vi this
là a()
. Vì vậy, tôi hiện đang viết đơn giản .bind(this)
sau mỗi chức năng gọi lại lời hứa duy nhất và trong tương lai tôi sẽ có thể sử dụng các chức năng mũi tên cho việc này, nhưng tôi đang tìm một giải pháp sạch hơn trong thời gian này.
này không có vẻ như là một ý tưởng rất tốt với tôi. Bạn muốn kết hợp một lời hứa với một số giá trị 'này' khi bạn tạo ra nó, và sau đó ở một số nơi hoàn toàn riêng biệt tham chiếu đến giá trị đó với' this'? Có vẻ như một đầu trầy xước thực sự cho bất cứ ai duy trì mã của bạn vì nó phá vỡ [Nguyên tắc ít ngạc nhiên nhất] (https://en.wikipedia.org/wiki/Principle_of_least_astonishment). – JLRishe
@ JLRishe: Từ một điểm tiêu thụ API, nó có thể có nhiều ý nghĩa, nhưng bạn sẽ phải xem xét bối cảnh rộng hơn của trường hợp cụ thể để hiểu. (Các nguyên tố polymer trong đó 'này' là thiết kế theo nghĩa vụ phải luôn đề cập đến phần tử hiện tại.) –
Đủ công bằng. :) – JLRishe