আমি কিছু ইউনিট পরীক্ষা করছি। পরীক্ষার কাঠামোটি একটি পৃষ্ঠাকে একটি আইফ্রেমে লোড করে এবং তারপরে সেই পৃষ্ঠাটির বিরুদ্ধে দৃ runs়তা দেয়। প্রতিটি পরীক্ষা শুরুর আগে আমি এমন একটি তৈরি করি Promise
যা আইফ্রেমের onload
ইভেন্টটি কল করার জন্য resolve()
সেট করে, আইফ্রেমের সেট করে src
এবং প্রতিশ্রুতি ফিরিয়ে দেয়।
সুতরাং, আমি কেবল কল করতে পারি loadUrl(url).then(myFunc)
, এবং এটি যা হবে তা কার্যকর করার আগে পৃষ্ঠাটি লোড হওয়ার জন্য অপেক্ষা করবে myFunc
।
আমি আমার পরীক্ষাগুলিতে পুরো জায়গা জুড়ে এই ধরণের প্যাটার্নটি ব্যবহার করি (কেবলমাত্র ইউআরএল লোড করার জন্য নয়), মূলত ডিওমে পরিবর্তন ঘটতে দেয় (উদাহরণস্বরূপ একটি বোতামে ক্লিক করে মিমিক করুন, এবং ডিভগুলি লুকাতে এবং দেখানোর জন্য অপেক্ষা করুন)।
এই ডিজাইনের ক্ষতিটি হ'ল আমি ক্রমাগত এগুলিতে কয়েকটি লাইনের কোড সহ বেনামে ফাংশন লিখছি। আরও, যখন আমার একটি ওয়ার্ক-এয়ার (কুইনাইটস assert.async()
) রয়েছে, টেস্ট ফাংশন যা প্রতিশ্রুতিগুলি সংশোধন করে প্রতিশ্রুতি সঞ্চালনের আগেই সম্পূর্ণ হয়।
আমি ভাবছি যে Promise
এটি নেট না হওয়া অবধি সমাধান না হওয়া অবধি অপেক্ষার (ব্লক / স্লিপ) কোনও মূল্য পাওয়ার উপায় আছে কিনা 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))
, যা অতি anons নিচে কাটা করতে পারেন।