2013-03-27 8 views
6

Ví dụ:q.js: tôi có thể ngừng chức năng thực hiện cho đến khi lời hứa được hoàn thành không?

if(foo) { 
    async_call(); // returns a Q promise object 
} 
// do this immediately if foo was false 
// or after the promise is resolved if foo was true 

Điều này thậm chí còn có thể?

Các lựa chọn thay thế mà tôi có thể thấy là luôn gọi chức năng async, vứt bỏ kiểm tra 'foo', điều này ít tối ưu hơn nhưng sẽ hoạt động trong mã; hoặc chỉ giả định rằng 'foo' là đúng và ném một lỗi nếu nó sai (yêu cầu người gọi thử lại sau khi gọi hàm async chính nó) mà thậm chí còn lý tưởng hơn vì lý do rõ ràng.

EDIT: như một công việc tạm thời xung quanh, tôi thấy việc này, nhưng nó hầu như không lý tưởng:

var promise = foo ? Q.defer().resolve(foo).promise : async_call(); 
promise.then(function(foo) { 
    // this is done after the async call if it was necessary or immediately if not 
}); 

Trả lời

6

Q.when() thể được sử dụng cho chính xác điều này, khi bạn không biết liệu giá trị có phải là lời hứa hay không.

Q.when(foo || async_call()).then(function (foo) { 
    //... 
}); 
+1

Hoàn hảo, đó là những gì tôi muốn! Cảm ơn! –

+2

Lưu ý rằng các biểu mẫu chuẩn là 'Q (valueOrPromise) .then (onFulfilled)' hoặc 'Q.when (valueOrPromise, onFulfilled)'. Yours làm việc quá, nhưng ít thành ngữ :) – Domenic

0

Bạn có thể, bằng cách định nghĩa một hàm như:

function do_this(err) { 
    // yay. 
} 

if(foo) { 
    async_call(arguments, do_this); 
} else { 
    do_this(); 
} 
+0

Tôi ít nhiều đã thực hiện chính xác điều này chỉ bằng thư viện Q, hãy xem câu trả lời đã chỉnh sửa của tôi. Cảm ơn cho đầu vào của bạn mặc dù :) –