2013-08-24 46 views
21

Tôi vừa mới triển khai hàm đầu tiên trả về một lời hứa dựa trên một lời hứa khác trong AngularJS, và nó hoạt động. Nhưng trước khi tôi quyết định chỉ cần làm điều đó, tôi đã dành 2 giờ đọc và cố gắng hiểu các khái niệm đằng sau lời hứa. Tôi nghĩ nếu tôi có thể viết một đoạn mã đơn giản mô phỏng những lời hứa đã hoạt động như thế nào, thì tôi sẽ có thể hiểu khái niệm nó thay vì có thể sử dụng nó mà không thực sự biết nó hoạt động như thế nào. Tôi không thể viết mã đó.Lời hứa hoạt động như thế nào trong JavaScript?

Vì vậy, ai đó có thể vui lòng minh họa trong vani JavaScript cách lời hứa hoạt động?

+2

Chỉ cần làm rõ sự mong đợi của bạn ... lời hứa là thứ bạn triển khai và không phải là ngôn ngữ được xây dựng bằng JavaScript vani. Kiểm tra điều này: http://www.benlesh.com/2012/09/javascript-promises-promises.html – Brad

+5

Không có lý do nào khiến câu hỏi này phải được đóng quá rộng. Đó là một câu hỏi rất rõ ràng và cụ thể. – Brad

Trả lời

30

Lời hứa về cơ bản là đối tượng có hai phương pháp. Một phương pháp là để xác định những gì cần làm, và một là để cho biết khi nào để làm điều đó. Nó phải được thể gọi hai phương pháp trong bất kỳ thứ tự, vì vậy đối tượng cần theo dõi trong đó một đã được gọi là:

var promise = { 
    isDone: false, 
    doneHandler: null, 
    done: function(f) { 
    if (this.isDone) { 
     f(); 
    } else { 
     this.doneHandler = f; 
    } 
    }, 
    callDone: function() { 
    if (this.doneHandler != null) { 
     this.doneHandler(); 
    } else { 
     this.isDone = true; 
    } 
    } 
}; 

Bạn có thể xác định các hành động đầu tiên, sau đó kích hoạt nó:

promise.done(function(){ alert('done'); }); 
promise.callDone(); 

Bạn có thể kích hoạt các hành động đầu tiên, sau đó xác định nó:

promise.callDone(); 
promise.done(function(){ alert('done'); }); 

Demo: http://jsfiddle.net/EvN9P/

Khi bạn sử dụng lời hứa trong một hàm không đồng bộ, hàm sẽ tạo ra lời hứa rỗng, giữ tham chiếu đến nó, và cũng trả về tham chiếu. Mã xử lý phản hồi không đồng bộ sẽ kích hoạt hành động trong lời hứa và mã gọi hàm không đồng bộ sẽ xác định hành động.

Khi một trong hai điều đó có thể xảy ra theo thứ tự bất kỳ, mã gọi hàm không đồng bộ có thể treo vào lời hứa và xác định hành động bất kỳ lúc nào nó muốn.

-1

Để đơn giản hiểu về những lời hứa trong Javascript. Bạn có thể tham khảo ví dụ bên dưới. Chỉ cần sao chép dán vào một tập tin php/html mới và chạy.

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 

function test(n){ 
    alert('input:'+n); 

    var promise = new Promise(function(fulfill, reject) {   
     /*put your condition here */ 
     if(n) { 
     fulfill("Inside If! match found"); 
     } 
     else { 
     reject(Error("It broke")); 
     } 
    }); 
    promise.then(function(result) { 
     alert(result); // "Inside If! match found" 
    }, function(err) { 
     alert(err); // Error: "It broke" 
    }); 
} 

</script> 

</head> 
<body> 
<input type="button" onclick="test(1);" value="Test"/> 

</body> 
</html> 
  1. Bấm vào thử nghiệm nút,
  2. Nó sẽ tạo ra lời hứa mới,
  3. nếu điều kiện sẽ là đúng nó thực hiện các phản ứng,
  4. sau đó promise.then gọi và dựa trên việc thực hiện nó sẽ in kết quả .
  5. Trong trường hợp từ chối lời hứa. Sau đó trả về thông báo lỗi.
0

Có lẽ ví dụ đơn giản nhất của việc sử dụng những lời hứa trông như thế:

var method1 = (addings = '') => { 
    return new Promise(resolve => { 
    console.log('method1' + addings) 
    resolve(addings + '_adding1'); 
    }); 
} 
var method2 = (addings = '') => { 
    return new Promise(resolve => { 
    console.log('method2' + addings) 
    resolve(addings + '_adding2'); 
    }); 
} 

method1().then(method2).then(method1).then(method2); 
// result: 
// method1    
// method2_adding1  
// method1_adding1_adding2 
// method2_adding1_adding2_adding1 

Đó là cơ bản của vấn đề cơ bản.Có nó, bạn có thể thử nghiệm với Rejects:

var method1 = (addings = '*') => { 
    return new Promise((resolve, reject) => { 
    console.log('method1' + addings) 
    resolve(addings + '_adding1'); 
    }); 
} 
var method2 = (addings = '*') => { 
    return new Promise((resolve, reject) => { 
    console.log('method2' + addings) 
    reject(); 
    }); 
} 
var errorMethod =() => { 
    console.log('errorMethod') 
} 
method1() 
.then(method2, errorMethod) 
.then(method1, errorMethod) 
.then(method2, errorMethod) 
.then(method1, errorMethod) 
.then(method2, errorMethod); 
// result: 
// method1*   
// method2*_adding1 
// errorMethod 
// method2* 
// errorMethod 
// method2* 

Như chúng ta có thể thấy, trong trường hợp hàm lỗi thất bại là bắn (mà luôn luôn là đối số thứ hai của then) và chức năng sau đó tiếp theo trong chuỗi là bắn không có được tranh luận.

Kiến thức nâng cao Tôi mời bạn here.

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