2015-07-02 3 views
0

Я получил эту рекурсивную функцию. Я вижу, что это циклично, когда возврат данных является нулевым, но он не возвращает обещание, когда данные не являются нулевыми после выполнения рекурсивной задачи. Похоже, что, закончив делать рекурсивную задачу, обещание где-то потеряется. Кто-нибудь укажет, что я сделал здесь неправильно?Рекурсивная функция Javascript с отсрочкой не возвращается

var callrq1 = function(globalsystemid, globalgraphid, start, end, lastcheck) { 
    var datetimeformat = "YYYY-MM-DD HH:mm:ss"; 
    var d1 = new $.Deferred(); 
    var request1 = "../system/" + globalsystemid + "/highcharts.xml?type=" + globalgraphid + "&start=" + start + "&end=" + end; 
    var requeststring1 = makejson(request1); //this makejson function is an ajax get and return promise 
    requeststring1.done(function(data) { 
    if (data != null) { 
     d1.resolve(data); 
    } else { 
     var theend = moment(lastcheck).format(datetimeformat); 
     var newstart = moment(end).format(datetimeformat); 
     var newend = moment(end).add(1, 'weeks').format(datetimeformat); 
     if (newend <= theend) { 
     //recursive callrq1 
     callrq1(globalsystemid, globalgraphid, newstart, newend, theend); 
     } else { 
     d1.resolve(null); 
     } 
    } 
    }); 
    return d1.promise(); 
} 

callrq1(globalsystemid, globalgraphid, starttimeobj.start, starttimeobj.end, endtimeobj.start).then(function(data) { 
    console.log(data); 
}); 

ответ

0

Вы пропустили разделяющие ваш отложенные в случае рекурсивного вызова. Тем не менее, вы shouldn't be using a deferred для этого, в первую очередь! Просто подключите обратный вызов then и верните обещание результата от вашей функции. Вы можете даже вернуть обещания от обратного вызова, который мы используем для рекурсивного случая:

function callrq1(globalsystemid, globalgraphid, start, end, lastcheck) { 
    var datetimeformat = "YYYY-MM-DD HH:mm:ss"; 
    var request1 = "../system/" + globalsystemid + "/highcharts.xml?type=" + globalgraphid + "&start=" + start + "&end=" + end; 
    var requeststring1 = makejson(request1); //this makejson function is an ajax get and return promise 
    return requeststring1.then(function(data) { 
//^^^^^^    ^^^^ 
    if (data != null) { 
     return data; 
// ^^^^^^ 
    } else { 
     var theend = moment(lastcheck).format(datetimeformat); 
     var newstart = moment(end).format(datetimeformat); 
     var newend = moment(end).add(1, 'weeks').format(datetimeformat); 
     if (newend <= theend) { 
     return callrq1(globalsystemid, globalgraphid, newstart, newend, theend); 
//  ^^^^^^ 
     } else { 
     return null; 
//  ^^^^^^ 
     } 
    } 
    }); 
} 
+0

Я также пробовал этот путь. Возвратите обещание результата от работ makejson. Да, я буду укусить это, поскольку один меньше отложенных/обещаний, хотя код выглядит довольно продвинутым, чтобы понять, как вы думаете, преимущество от этого сравнивается с вышеизложенным? Большое спасибо за ввод. –

+0

Это более краткий, более функциональный, быстрый, менее ошибочный, более понятный (более естественный поток) ... Пожалуйста, проверьте ссылку в моем ответе. – Bergi

+0

Спасибо, Берги, да, просто переваривая вашу ссылку, еще одна вещь, чтобы узнать :). Я из C фона и поэтому используется для неявного кодирования. Огромное спасибо! –

0

Вы не разрешение отсроченных в случае рекурсии

var callrq1 = function (globalsystemid, globalgraphid, start, end, lastcheck) { 
    var datetimeformat = "YYYY-MM-DD HH:mm:ss"; 
    var d1 = new $.Deferred(); 
    var request1 = "../system/" + globalsystemid + "/highcharts.xml?type=" + globalgraphid + "&start=" + start + "&end=" + end; 
    var requeststring1 = makejson(request1); //this makejson function is an ajax get and return promise 
    requeststring1.done(function (data) { 
     if (data != null) { 
      d1.resolve(data); 
     } else { 
      var theend = moment(lastcheck).format(datetimeformat); 
      var newstart = moment(end).format(datetimeformat); 
      var newend = moment(end).add(1, 'weeks').format(datetimeformat); 
      if (newend <= theend) { 
       //recursive callrq1 
       callrq1(globalsystemid, globalgraphid, newstart, newend, theend).done(function(data){ 
        d1.resolve(data);//pass any data required 
       }); 
      } else { 
       d1.resolve(null); 
      } 
     } 
    }); 
    return d1.promise(); 
} 

callrq1(globalsystemid, globalgraphid, starttimeobj.start, starttimeobj.end, endtimeobj.start).then(function (data) { 
    console.log(data); 
}); 
+0

Спасибо Arun. Он работает как чемпион. Почему я этого не видел! : p –

+1

http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

+0

Спасибо, Бенджи. Берги зафиксировал выше, и я прочитал вашу ссылку. Спасибо –

Смежные вопросы