मैं जावास्क्रिप्ट में एकल थ्रेडेड व्यवहार को कैसे मजबूर कर सकता हूं?

मैं जावास्क्रिप्ट के लिए नया हूं और मैं बस अपने समवर्ती मॉडल के साथ काम करना सीख रहा हूं। अभी, मेरे पास निम्न कोड है जिसमें मैं एक व्यस्त Wait फ़ंक्शन को लागू करने का प्रयास कर रहा हूं:

function captureFile() {
  return "screenshots/anthem" + ++numCaptures + ".png"
};

function busyWait(casper, selector, action) {
  casper.echo('busyWait', 'INFO');
  casper.waitUntilVisible(
    selector,
    function then() {
      this.capture(captureFile());
      casper.captureSelector(captureFile(), selector);
      casper.echo(selector + ' is Visible', 'INFO');
      action(casper);
    },
    function onTimeout() {
      casper.capture(captureFile());
      casper.echo('Continue to Wait', 'INFO');
      busyWait(casper, selector);
    },
    1000
  );
};

casper.start(anthem_url, function() {
 //Try to find the survey and dismiss it.
  var surveyID = 'div.fsrFloatingContainer';
  busyWait(this, surveyID, function action(casper) {
    casper.clickLabel('No, thanks', 'a');
    casper.echo('Dismissed Survey', 'INFO');
  });

 //enter Last Name
  var nameID = '#ctl00_MainContent_maincontent_SearchWizard6_LastName';
  busyWait(this, nameID, function action(casper) {
    casper.sendKeys(nameID, name);
    casper.echo('Set Name to: ' + name, 'INFO');
  });
  this.sendKeys(nameID, name);
  this.capture(captureFile());
});

casper.run(function() {
  this.exit();
});

रिटर्न के ऊपर कोड चल रहा है:

$casperjs casper_anthem.js
busyWait
busyWait
div.fsrFloatingContainer is Visible
Dismissed Survey
#ctl00_MainContent_maincontent_SearchWizard6_LastName is Visible
Set Name to: Smith

तो, समस्या यह है कि मैं एक व्यस्त वाइट लूप को लागू करने के लिए कॉलबैक का उपयोग कर रहा हूं। बेशक यह काम नहीं करता है क्योंकि जावास्क्रिप्ट में कॉलबैक असीमित हैं। मेरा सवाल है: मैं अपने कॉलबैक से एक तुल्यकालिक व्यवहार कैसे कर सकता हूं?

समाधान

CasperJS में तब() फ़ंक्शन को वास्तव में करने का तरीका है।

function busyWait(casper, selector, action) {
  casper.waitUntilVisible(
    selector,
    function then() {
      casper.echo(selector + ' is Visible', 'INFO');
      casper.captureSelector(captureFile(), selector);
      action(casper);
      casper.capture(captureFile());
    },
    function onTimeout() {
      casper.echo('Continue to Wait for ' + selector, 'INFO');
      casper.capture(captureFile());
      busyWait(casper, selector, function action(casper) { action(casper) });
    },
    5000
  );
};

casper.start(anthem_url);

// Try to find the survey and dismiss it.
casper.then(function() {
  this.capture(captureFile());
  busyWait(this, surveyID, function action(casper) {
    casper.clickLabel('No, thanks', 'a');
    casper.echo('Dismissed Survey', 'INFO');
  });
});

// enter Last Name
casper.then(function() {
  var nameID = '#ctl00_MainContent_maincontent_SearchWizard6_LastName';
  this.waitWhileSelector(surveyID, function() {
    busyWait(this, nameID, function action(casper) {
      casper.sendKeys(nameID, name);
      casper.echo('Set Name to: ' + name, 'INFO');
    });
  });
});

casper.run();

असल में, मुझे बस प्रत्येक क्रिया को अपने फिर() ब्लॉक में रखना होगा और कैस्परजेएस को क्रमबद्ध करने का प्रबंधन करना होगा।

0
आप नहीं करते आप डिज़ाइन के हिस्से के रूप में एसिंक्रोनस व्यवहार के साथ अपना तर्क बनाते हैं।
जोड़ा लेखक Pointy, स्रोत
कृपया अपने प्रश्न से समाधान हटाएं और इसे एक अलग उत्तर के रूप में पोस्ट करें। इसके बाद आप इसे कुछ समय बाद स्वीकार कर सकते हैं।
जोड़ा लेखक Artjom B., स्रोत

1 उत्तर

पॉइंटी को जवाब मिला। कंटेनर दिखाई देने के बाद जो कुछ भी होता है उसे फिर फ़ंक्शन में कोड किया जाना चाहिए, जो कोड के मुख्य ब्लॉक के बाद निष्पादित करने जा रहा है। यदि आप पिछले इनपुट से परिणामों पर निर्भर प्रत्येक इनपुट (जैसे पाठ या बटन) की प्रकृति के साथ इनपुट की एक श्रृंखला के साथ उपयोगकर्ता को पेश करने जा रहे हैं, तो आप बहुत से नेस्टेड कॉलबैक के साथ समाप्त हो जाएंगे। (इस तरह यह काम करना चाहिए।)

(प्रैक्टिस में, आप काम करने के लिए फ़ंक्शंस को कॉल करके यह स्पष्ट दिख सकते हैं। यह इंडेंटिंग पर सहेजता है, लेकिन इसका मतलब है कि कोड को देखने वाले किसी को कोड के वास्तविक प्रवाह को समझने में कुछ समय लगेगा।)

प्रवृत्ति - जब तक आप इसका उपयोग नहीं करते - अनुक्रमिक कोड लिखना है:

first do this ...
then do this ...
then this ...

और यह इस तरह के यूआई में काम नहीं करता है।

0
जोड़ा
मान्य बिंदु, लेकिन सवाल का जवाब नहीं देता है। मैं पूरी तरह से आपके साथ सहमत हूं।
जोड़ा लेखक Artjom B., स्रोत