मैं कुछ यूनिट परीक्षण कर रहा हूं। परीक्षण की रूपरेखा किसी पृष्ठ को iFrame में लोड करती है और फिर उस पृष्ठ के विरुद्ध अभिकथन करती है। इससे पहले कि प्रत्येक परीक्षा शुरू होता है, मैं बनाने के एक Promise
जो iFrame के सेट onload
कॉल करने के लिए घटना resolve()
, iFrame के सेट src
, और रिटर्न वादा।
इसलिए, मैं बस कॉल कर सकता हूं loadUrl(url).then(myFunc)
, और जो कुछ भी myFunc
है उसे निष्पादित करने से पहले पृष्ठ के लोड होने की प्रतीक्षा करेगा ।
मैं अपने परीक्षणों में पूरे स्थान पर इस तरह के पैटर्न का उपयोग करता हूं (न केवल यूआरएल लोड करने के लिए), मुख्य रूप से डोम में होने वाले बदलावों की अनुमति देने के लिए (उदाहरण के लिए एक बटन पर क्लिक करके नकल करें, और छिपाने और दिखाने के लिए divs की प्रतीक्षा करें)।
इस डिजाइन के लिए नकारात्मक यह है कि मैं उनमें कोड की कुछ पंक्तियों के साथ लगातार अनाम फ़ंक्शन लिख रहा हूं। इसके अलावा, जब मेरे पास काम (क्वेट assert.async()
) है, तो वादे को पूरा करने से पहले वादों को पूरा करने वाला परीक्षण कार्य।
मैं सोच रहा था कि क्या कोई तरीका है Promise
या प्रतीक्षा (ब्लॉक / नींद) से एक मूल्य प्राप्त करने के लिए जब तक कि यह हल न हो, .NET के समान IAsyncResult.WaitHandle.WaitOne()
। मुझे पता है कि जावास्क्रिप्ट एकल-थ्रेडेड है, लेकिन मैं उम्मीद कर रहा हूं कि इसका मतलब यह नहीं है कि एक फ़ंक्शन उपज नहीं कर सकता है।
संक्षेप में, क्या सही क्रम में परिणामों को थूकने के लिए एक तरीका है?
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))
स्टीयरिंग () कॉल, जैसे , जो बहुत हद तक चींटियों को काट सकता है।