मैं इस कोड से बेताब हूँ।

getSumOfSpecificDayWeek(daysMonth: any, callback: any){
    var data = [];
    var that = this;
    daysMonth.forEach(function(day){
      that.statsService.getData(that.userid, day).subscribe(async (res: any) => {
        data = JSON.parse(JSON.stringify(res));
        console.log(that.data);
        that.data = that.data.map( function(v, i) {
          return v + data[i];
        });
      });
    });
    callback("this should be at the end");
  }

यहां मैं जो कर रहा हूं वह एक सर्वर से सरणी प्राप्त कर रहा है और उसमें संक्षेप में है। इसके प्रत्येक घटक के अनुसार डेटा, यह ठीक काम करता है लेकिन अंत में मैं परिणाम को औसत करना चाहता हूं, इस समय मैं बस कॉल कर रहा हूं कॉलबैक यह जांचने के लिए एक संदेश दिखाने के लिए कि क्या यह अंत में होता है, लेकिन नहीं, "यह अंत में होना चाहिए" लूप शुरू होने से पहले प्रदर्शित होता है।

  mycallback(arg: any){
    console.log(arg);
  }

यह विधि के लिए मुख्य कॉल है

this.getSumOfSpecificDayWeek(daysMonth, this.mycallback);
0
Sergio Barbero 29 मार्च 2018, 17:27

2 जवाब

सबसे बढ़िया उत्तर

थोड़ा और RxJS, लेकिन अधिक सुरुचिपूर्ण तरीका:

getSumOfSpecificDayWeek(daysMonth: any, callback: any){
    var data = [];
    var that = this;
    let getCalls = []; // <--- This will contain all of your observables.
    daysMonth.forEach(function(day){
      const observable = that.statsService.getData(that.userid, day);
      getCalls.push(observable); // <--- Add the current observable to the array.
      observable.subscribe(async (res: any) => {
        data = JSON.parse(JSON.stringify(res));
        console.log(that.data);
        that.data = that.data.map( function(v, i) {
          return v + data[i];
        });
      });
    });
    // And here, you can use `callback`:
    Observable.forkJoin(...getCalls).subscribe(results => {
      callback("this should be at the end");
    });
}
3
Roland Rácz 29 मार्च 2018, 14:50

तो, जावास्क्रिप्ट में इस तरह की बात दुख की बात है। यह क्या करेगा पृष्ठभूमि में daysMonth में सब कुछ के लिए अनुरोध को बंद करना, फिर अपने कॉलबैक को कॉल करें। आपके द्वारा पहले निकाल दिए गए async अनुरोध फिर किसी बिंदु पर पूरे होंगे।

अंततः, आपको यह पता लगाने की आवश्यकता है कि आपने सभी कार्य कब कर लिए हैं, तब अपने कॉलबैक को बंद कर दें। इसके बजाय कुछ इस तरह देखें:

var numDone = 0;

daysMonth.forEach(function(day){
  that.statsService.getData(that.userid, day).subscribe(async (res: any) => {
    numDone++;

    data = JSON.parse(JSON.stringify(res));
    console.log(that.data);
    that.data = that.data.map( function(v, i) {
      return v + data[i];
    });

    if(numDone == daysMonth.length) {
      callback("All done!")
    }
  });
});

प्रभावी रूप से, हम getData() कॉलबैक में कुछ काम कर सकते हैं, और अगर हम आखिरी चीज चल रहे हैं, तो हम बाहरी कॉलबैक को किसी भी डेटा के साथ कॉल करते हैं जो हम चाहते हैं।

बेशक, यह गड़बड़ हो सकता है। async लाइब्रेरी इन सभी को अच्छी तरह से सारगर्भित करती है, इसलिए आप इसका उपयोग करने में सक्षम हो सकते हैं async.map आपके उद्देश्यों के लिए भी।

0
slugonamission 29 मार्च 2018, 14:41