2015-05-20 1 views
1

Я делал все виды чтения по обещаниям и созданию модуля, и я не могу понять, почему это не сработает.Модуль RequireJS получает JSON от сервера API, возвращает undefined?

Я пишу сценарий, который берет имя пользователя, а затем использует отдельный модуль для получения пользовательских данных от стороннего API. Я могу заставить все работать нормально, когда его помещают в один и тот же скрипт, но я делаю что-то не так, когда я вытаскиваю и отделяю запрос API от своего собственного модуля. Они построены с дюрандалом в качестве основы.

Сценарий:

define(function(require) { 
var http = require('plugins/http'), 
    ko = require('knockout'), 
    apiPullMod = require('apiPullMod'); 

return { 
    name: ko.observable('RyeBrush'), 
    nameInfo: ko.observableArray([]), 
    getSummoner: function() { 
     var that = this; 
     if (!that.nameInfo()) { 
      return; 
     } else { 
      that.nameInfo.push(apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na')) 
     }; 
     console.log(that.nameInfo); 
    } 
}; 
}); 

Модуль:

define(['plugins/http'], function(http) { 
return { 
    apiCaller: function(apiType, apiUserId, region) { 
     http.get('https://' + region + '.api.pvp.net/api/lol/' + region + '/' + apiType + '/' + apiUserId + '?api_key=282d6dcb-a047-4262-88d0-c53b0e28e6ef', 'jsoncallback').then(function(response) { 
      console.log(response); 
      return response; 
     }) 
    } 
} 
}); 

Я могу видеть из консоли, что запрос API является успешным, я получаю expecetd объект JSON и все, кажется, работает нормально , Однако, когда я нажимаю его на массив nameInfo, я получаю следующее: c(), зависающий над этим в firebug, дает мне путь к моей библиотеке нокаута.

Когда я пытаюсь это:

apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na').then(function(response){ 
       that.nameInfo.push(response); 
       console.log(response); 
      }) 

модуль не загружается, я думаю, потому что у меня нет then свойство записано в самом модуле. Однако, когда я читаю документацию для durandal и requirejs в этом контексте, он читает, что мне не нужно?

Если бы мне пришлось вскипятить его, мой вопрос: как мне отформатировать мой модуль и сценарий, который его вызывает, передать объект JSON из одного в другой?

ПРИМЕЧАНИЕ. Я включил свой персональный ключ API в этот вопрос, потому что я могу сбросить его по требованию. Я не беспокоюсь о моем трафике API в начале разработки моего приложения.

ответ

1

Если изменить apiCaller вернуть обещание он может работать, как этот

define(['plugins/http'], function(http) { 
    return { 
     apiCaller: function(apiType, apiUserId, region) { 
      return http.get('https://' + region + '.api.pvp.net/api/lol/' + region + '/' + apiType + '/' + apiUserId + '?api_key=282d6dcb-a047-4262-88d0-c53b0e28e6ef', 'jsoncallback'); 
     } 
    }; 
}); 

apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na').then(function(response){ 
    that.nameInfo.push(response); 
    console.log(response); 
}); 
+0

Я попробую, когда вернусь домой позже. Я мог бы также попытаться добавить более надежную библиотеку обещаний, чем просто полагаться на дюрандал и потребовать, чтобы все это работало. –

+0

ЭТО РАБОТАЕТ! Спасибо! Но почему это сработало? Почему бы не передать ответ обратно через возврат в настройке '.then'? Я надеялся добавить к нему больше функциональных возможностей, но сейчас это работает. –

+1

Я не думаю, что могу объяснить, как обещают работу в комментарии. Вот вопрос с довольно хорошими ответами, которые могут вам помочь, http://stackoverflow.com/q/5316697/975720. – lagerone

0

Похоже HTTP плагин использует карту плагин KNOCKOUT, чтобы автоматически преобразовать ваш ответ наблюдаемыми. Я рекомендую использовать jQuery http-плагин или другое.

+0

Это странно. Возможно, ваше право, может объяснить значение 'c()'. Будет конвертировать в jQuery прямо сегодня. –

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