Я делал все виды чтения по обещаниям и созданию модуля, и я не могу понять, почему это не сработает.Модуль 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 в начале разработки моего приложения.
Я попробую, когда вернусь домой позже. Я мог бы также попытаться добавить более надежную библиотеку обещаний, чем просто полагаться на дюрандал и потребовать, чтобы все это работало. –
ЭТО РАБОТАЕТ! Спасибо! Но почему это сработало? Почему бы не передать ответ обратно через возврат в настройке '.then'? Я надеялся добавить к нему больше функциональных возможностей, но сейчас это работает. –
Я не думаю, что могу объяснить, как обещают работу в комментарии. Вот вопрос с довольно хорошими ответами, которые могут вам помочь, http://stackoverflow.com/q/5316697/975720. – lagerone