2013-05-08 20 views
14

Tôi có một số mã như:Ràng buộc một hàm xử lý hứa hẹn cho một đối tượng

var bar = foo().then(function success(value) { 
    // compute something from a value... 
}, function failure(reason) { 
    // handle an error... 
}); 

Làm thế nào để ràng buộc failure chức năng để đối tượng this trong bối cảnh bar. Tôi biết tôi sẽ phải sử dụng myFunc.bind(this) nhưng tôi phải thay thế gì thay vì myFunc?

+0

Những loại promisses đang nói gì vậy? JavaScript promisses vẫn đang được thảo luận cho ES6 – fmsf

+0

Vâng, tôi đang nói về lời hứa JavaScript. –

+0

Đó là khó tin, các lời hứa javascript es6 vẫn chưa được thực hiện. Bạn cần cung cấp thêm ngữ cảnh. http://mozilla.6506.n7.nabble.com/Promise-Future-asynchrony-in-then-td278846.html#a279080 – fmsf

Trả lời

35

Bạn có thể sử dụng bind như thế này:

var bar = foo().then(function success(value) { 
    // compute something from a value... 
}, function failure(reason) { 
    // handle an error... 
}.bind(this)); 
4

Bạn hiện đang có một chức năng ẩn danh (mặc dù dán nhãn) cho gọi lại thất bại của bạn:

function failure(reason) { 
    // handle an error... 
} 

Như robertklep nói, bạn ngay lập tức có thể gọi .bind về chức năng ẩn danh đó. Tuy nhiên, nó có thể là dễ đọc hơn để sử dụng một hàm có tên thay vào đó, và vượt qua nó vào .then() như là một biến:

function success(value) { 
    // compute something from a value... 
} 
function failure(reason) { 
    // handle an error... 
} 
var bar = foo().then(success, failure.bind(this)); 
+0

Tôi nghĩ bạn có nghĩa là 'thất bại = failure.bind (this) '? – robertklep

+1

@robertklep Ah, có thể là; Tôi không thực sự quen thuộc với '.bind()'. Nếu nó trả về một đối tượng mới, thay vì hành động đúng chỗ, tôi giả sử 'foo(). Sau đó (success, failure.bind (this));' sẽ khá dễ đọc. – IMSoP

+1

vâng, nó trả về một đối tượng mới :) để dễ đọc hơn, đó là vấn đề tranh luận;) – robertklep

0

Những gì tôi thấy rất hữu ích là để ràng buộc mỗi then() 's [chức năng] handler cho một sản phẩm nào đối tượng, do đó, mỗi chức năng có thể có quyền truy cập vào nó. Sau đó, người dùng có thể đặt và nhận các thuộc tính trong mỗi Lời hứa bằng cách từ khóa this. Các khung kiểm thử đơn vị hoạt động tương tự.

chainPromiseList([getName,getAge],finalDone,rejectHandle); 
 

 
    function chainPromiseList(promiseList,finalDone,errHandle){ 
 
     var userContext = new UserContext(); 
 
     if(typeof finalDone==='function') promiseList.push(finalDone); 
 
     if(typeof errHandle==='function') promiseList.push(errHandle); 
 
     return promiseList.reduce((total,curVal,curInd,arr)=>{ 
 
     var last = curInd+1===arr.length; 
 
     var method = last&&typeof errHandle==='function' ? 'catch':'then'; 
 
     var concatenated = total[method](curVal.bind(userContext)); 
 
     return concatenated; 
 
     },Promise.resolve()); 
 
     function UserContext(){}; 
 
    } 
 
    
 
    function getName(){ 
 
     return new Promise((resolve,reject)=>{ 
 
     setTimeout(()=>{ 
 
      console.log('got name!'); 
 
      this.name = 'Paul'; 
 
      resolve(); 
 
     },500); 
 
     }); 
 
    } 
 

 
    function getAge(){ 
 
     return new Promise((resolve,reject)=>{ 
 
     setTimeout(()=>{ 
 
      console.log('got age!'); 
 
      this.age = 26; 
 
      resolve(); 
 
     },500); 
 
     }); 
 
    } 
 

 
    function finalDone(){ 
 
     console.log(`Hello, I'm ${this.name} and I'm ${this.age}yo.`); 
 
    } 
 

 
    function rejectHandle(msg){ 
 
     console.log('Error: ',msg); 
 
    }

Các vấn đề liên quan