समस्या:

एक छात्र के लिए, मैं नवीनतम अंक प्राप्त करना चाहूंगा। यह संभव है कि उनके पास कुछ अनंतिम और कुछ स्वीकृत अंक हों। अनंतिम संपादित किया जा सकता है जबकि स्वीकृत नहीं किया जा सकता है। पहले मैं डिफ़ॉल्ट रूप से latestResult को वैरिएबल में स्टोर करता हूं, यह या तो अनंतिम हो सकता है या स्वीकार किया जा सकता है। इसके बाद, मैं नवीनतम स्वीकृत की जांच करने के लिए सभी परिणामों के लिए एक खोज चलाने की कोशिश कर रहा हूं। अंत में, मैं जानना चाहता हूं कि स्वीकृत परिणाम किस index of i पर मौजूद है। हालाँकि, जब मैं console.log में .done करता हूं तो i का मान हमेशा -1 के रूप में आता है और जब मैं console.log लूप के लिए बाहर आता हूं तो यह रिक्त के रूप में आता है।

मैं ऐसे किसी भी सुझाव की तलाश में हूं जिसके माध्यम से लूप के बाहर .किया गया से उदाहरण के मूल्य i तक पहुंच संभव हो।

कोड

var check = 0;
for (var i = res.length-1; i >= 0; i--){
    connectionResult = res[i];
    //latest result
    latestResult = res[res.length-1];
    
    var idNew =  connectionResult.id;
    var filterNew = ['result', 'is', idNew];
    var recordNew = 'acceptedresult';
    
    getData({
        type: recordNew,
        filter: filterNew,
        fields: [
            'id'
        ]
    }).done(function (items) {
        if (items.length > 0) {
            check = i;
            console.log("check: ",i);
            //break;
        }
    });
} //end for

console.log(check); //display empty
0
colourtheweb 15 जुलाई 2020, 02:26
GetData से पहले एक const idx = i जोड़ें और i के बजाय idx का उपयोग करें, या किसी भी तरह कॉलबैक फ़ंक्शन में i के तत्काल मूल्यांकन को बाध्य करें (फ़ंक्शन केवल घोषित किया गया है और कॉल नहीं किया गया है, इसलिए मेरा अभी तक मूल्यांकन नहीं किया गया है)। वर मैं फहराया जा रहा है। यह लूप के लिए पहले var i होने जैसा है, इसलिए किए गए समय को i का मान -1 तक घटा दिया गया है
 – 
user120242
15 जुलाई 2020, 02:31
या var i के बजाय let i = res.length-1 का उपयोग करें (चलो ब्लॉकों में स्कोप किया जा सकता है, जबकि var फहराया जाता है)
 – 
user120242
15 जुलाई 2020, 02:39

2 जवाब

समस्या यह है कि आप एसिंक्रोनस फ़ंक्शन के अंदर i को पढ़ने की कोशिश कर रहे हैं, इसलिए जब तक गेटडेटा लूप के लिए समाप्त/समाधान नहीं कर लेता है तब तक i = -1 हो चुका होता है।

ठीक करने के लिए आपको क्या करने की आवश्यकता है https://caolan.github.io/async/v3/ जैसे async प्रवाह नियंत्रक पुस्तकालय का उपयोग करने का सही तरीका है

या हैकिश तरीका जिसे आप किसी अन्य फ़ंक्शन में डेटा प्राप्त करते हैं और पैरामीटर के रूप में i पास करते हैं, इसलिए उन पंक्तियों के साथ कुछ

 var check = 0;
for (var i = res.length-1; i >= 0; i--){
    connectionResult = res[i];
    //latest result
    latestResult = res[res.length-1];
    
    var idNew =  connectionResult.id;
    var filterNew = ['result', 'is', idNew];
    var recordNew = 'acceptedresult';
    var params = {
        type: recordNew,
        filter: filterNew,
        fields: [
            'id'
        ]
    };
    hackishGetData(params, 1 );
} //end for

function hackishGetData(params, i){
      getData(params).done(function (items) {
        if (items.length > 0) {
            check = i;
            console.log("check: ",i);
            //break;
        }
    });
}

मैं हैकिश तरीके की अनुशंसा नहीं करता।

0
mena happy 15 जुलाई 2020, 02:54
var check = 0;
for(var i = ...

के बराबर है

var check = 0;
var i;
for(i = ...

i वेरिएबल लूप के लिए स्कोप नहीं है, क्योंकि var ब्लॉक स्कोप नहीं है और उसे होस्टेड, इसलिए कॉलबैक फ़ंक्शन द्वारा उपयोग किए जाने वाले i के मान को कॉलबैक के अंदर मूल्यांकन किए जाने तक -1 से घटाकर -1 कर दिया गया है।

आप let का इस्तेमाल कर सकते हैं , जो ब्लॉक के दायरे में है और फहराया नहीं जाता है:

var check = 0;
for (let i = res.length-1; i >= 0; i--){
    connectionResult = res[i];
    //latest result
    latestResult = res[res.length-1];
    
    var idNew =  connectionResult.id;
    var filterNew = ['result', 'is', idNew];
    var recordNew = 'acceptedresult';
    
    getData({
        type: recordNew,
        filter: filterNew,
        fields: [
            'id'
        ]
    }).done(function (items) {
        if (items.length > 0) {
            check = i;
            console.log("check: ",i);
            //break;
        }
    });
} //end for

console.log(check); //display empty

या i के तत्काल मूल्यांकन के लिए बाध्य करें (और मूल्यांकन मूल्य के साथ एक दायरा संलग्न करें (यहां एक फ़ंक्शन क्लोजर का उपयोग करके)):

var check = 0;
for (var i = res.length-1; i >= 0; i--){
  (function(i){
    connectionResult = res[i];
    //latest result
    latestResult = res[res.length-1];
    
    var idNew =  connectionResult.id;
    var filterNew = ['result', 'is', idNew];
    var recordNew = 'acceptedresult';
    
    getData({
        type: recordNew,
        filter: filterNew,
        fields: [
            'id'
        ]
    }).done(function (items) {
        if (items.length > 0) {
            check = i;
            console.log("check: ",i);
            //break;
        }
    });
  )(i); // force immediate evaluation of value of i, scoped to this function closure
} //end for

console.log(check); //display empty
0
user120242 15 जुलाई 2020, 03:06