2015-05-19 20 views
5

Mã sau đây trả về:Tại sao lời hứa vẫn đang chờ xử lý?

output.isPending?: true 
output.isRejected?: false 
output.isFulfilled?: false 

Tại sao? Tôi đã mong đợi output.isRejectedtrue.

<html> 

<head> 
    <script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.7/q.js"></script> 
    <script src="http://jasmine.github.io/2.3/lib/jasmine.js"></script> 
</head> 

<body> 
</body> 
<script> 
var output, bar; 

bar = { 
    doSomethingAsync: function() { 
     var d = Q.defer(); 
     d.resolve('result'); 
     return d.promise; 
    } 
}; 

function Foo(bar) { 
    this._bar = bar; 

    this.go = function() { 
     var deferred = Q.defer(); 
     this._bar.doSomethingAsync() 
      .then(onSuccess.bind(this, deferred)); 

     return deferred.promise; 
    } 
}; 

function onSuccess(deferred, result) { 
    deferred.reject(); 
} 

output = new Foo(bar).go() 
    .finally(function() { 
     console.log('output.isPending?:', output.isPending()); 
     console.log('output.isRejected?:', output.isRejected()); 
     console.log('output.isFulfilled?:', output.isFulfilled()); 
    }); 
</script> 

</html> 

Trả lời

5

Bởi vì không phải là outputnew Foo(bar).go(). Nó được gán kết quả của cuộc gọi .finally() và sẽ không được giải quyết cho đến khi cuộc gọi lại finally hoàn tất.

này sẽ làm việc như mong đợi:

var output = new Foo(bar).go(); 
output.finally(function() { 
    console.log('output.isPending?:', output.isPending()); 
    console.log('output.isRejected?:', output.isRejected()); 
    console.log('output.isFulfilled?:', output.isFulfilled()); 
}); 
+0

Từ https://github.com/kriskowal/q - 'Nếu trình xử lý trả về một lời hứa, outputPromise bị trì hoãn .....' – Adam

0

Tôi đứng sửa chữa một hàm delay tầm thường là không cần thiết ngay cả đối với của API mà là không biết gì về những lời hứa. Tôi có thể đảm bảo rằng resolve hoặc reject luôn được gọi, nhưng sau khi bản thân lời hứa được trả về không chậm trễ. Đây là ví dụ:

var somePromise = function(path) { 
    var deferred = q.defer(); 

    asyncFunction.request(path, function(result) { 
     if (result.error === 0 && result.json !== null) { 
      deferred.resolve(result); 
     } else { 
      deferred.reject(result || {error: -1, message: "bad things happened"}); 
     } 
    }); 

    return deferred.promise; 
}; 

exports.someCall = function(req,res) { 
    somePromise('path') 
     .then(function (result) { 
      ... do action ... 
     }).catch(function (error) { 
      ... handle error ... 
     }); 
}; 
+1

Không cần cho 'resolve' hoặc' reject' chỉ sau khi trở về một lời hứa. Tất cả các cuộc gọi lại được gọi là không đồng bộ, bất kể khi nào/cách bạn giải quyết lời hứa của mình. Sử dụng các dạng trì hoãn như thế này thậm chí trông hơi giống [antipattern chung] (http://stackoverflow.com/q/23803743/1048572). – Bergi

+0

Mã này vẫn cho phép những lời hứa được xiềng xích, ví dụ: 'exports.someCall = function (req, res) { somePromise ('path') .Sau đó (function (kết quả) { trở somePromise ('con đường mới'), Sau đó (chức năng (kết quả) { ... làm điều gì khác ... ' –

+0

Có, nhưng' q.delay (1) 'vẫn là không cần thiết? – Bergi

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