Tôi đang thực hiện một số thử nghiệm đơn vị. Khung thử nghiệm tải một trang vào iFrame và sau đó chạy các xác nhận đối với trang đó. Trước khi mỗi thử nghiệm bắt đầu, tôi tạo một Promise
thiết lập onload
sự kiện của iFrame để gọi resolve()
, đặt iFrame src
và trả về lời hứa.
Vì vậy, tôi chỉ có thể gọi loadUrl(url).then(myFunc)
và nó sẽ đợi trang tải trước khi thực thi bất kỳ điều gìmyFunc
.
Tôi sử dụng loại mẫu này khắp nơi trong các thử nghiệm của mình (không chỉ để tải URL), chủ yếu để cho phép các thay đổi đối với DOM xảy ra (ví dụ: bắt chước cách nhấp vào một nút và đợi các div ẩn và hiển thị).
Nhược điểm của thiết kế này là tôi liên tục viết các hàm ẩn danh với một vài dòng mã trong đó. Hơn nữa, trong khi tôi có một công việc xung quanh (QUnit'sassert.async()
), hàm kiểm tra xác định các lời hứa sẽ hoàn thành trước khi lời hứa được chạy.
Tôi tự hỏi liệu có cách nào để lấy giá trị từ a Promise
hoặc đợi (khối / ngủ) cho đến khi nó được giải quyết, tương tự như .NET'sIAsyncResult.WaitHandle.WaitOne()
. Tôi biết JavaScript là một luồng, nhưng tôi hy vọng điều đó không có nghĩa là một hàm không thể mang lại.
Về bản chất, có cách nào sau đây để nhổ cho kết quả theo đúng thứ tự?
function kickOff() {
return new Promise(function(resolve, reject) {
$("#output").append("start");
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
$("#output").append(" middle");
return " end";
});
};
function getResultFrom(promise) {
// todo
return " end";
}
var promise = kickOff();
var result = getResultFrom(promise);
$("#output").append(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
.then(fnAppend.bind(myDiv))
, điều này có thể cắt giảm đáng kể các anons.