Как вернуть json из метода внутри модуля AMD?

Я продолжаю получать "undefined" при попытке проверить наличие моего json-объекта. Я не понимаю, почему?

ПЕРЕСМОТР: Я прочитал... подробно... сообщение, указанное здесь... Как вернуть ответ от асинхронного вызова?

В этом сообщении в конце этого самого эпического ответа автор упоминает, что просто не использует $.getJSON. Я не вижу этого в качестве варианта в моем случае. Моя ситуация отличается тем, что мне нужно использовать $.getJSON, чтобы, к примеру, получить json. Кроме того, моя конфигурация отличается тем, что мой вызов $.getJSON находится внутри прототипа внутри модуля AMD. Эта статья помогла мне понять, что я могу вернуть весь $.getJSON, и я обновил свой код, чтобы отразить это. Итак, теперь...

Что мне нужно сделать, чтобы при вызове codelib.gotjson из моего тестового файла и проверить значение чего-то внутри результирующего объекта?

ПРИМЕЧАНИЕ. Я вижу внутри "Объекта" в моей консоли Chrome, что позволяет показать console.dir(результат). И внутри этого объекта я могу увидеть "responseText", содержащий драгоценную драгоценную строку json, которую я получаю. Но я теперь зациклился на том, как написать утверждение для него?

Я хочу написать что-то вроде....

assert.equal(Object.responseText.name, "bob", "равно bob" )

Я сейчас так близок. Любая помощь приветствуется. Спасибо.

codelib.js

"use strict";

define(function() {
  //constructor
  function Codelib(a,b){
    // if u had passed vars
    this.b = b;
    this.a = a;
  }

  //methods
  Codelib.prototype.code = function(a, b) {
    return (a + b);
  };

  //methods
  Codelib.prototype.gotjson = function() {
      return $.getJSON("https://api.twitch.tv/kraken/streams/MedryBW")
          .done(function (data) {
            console.log('gotJSON: ');
            console.dir(data);
          })
          .fail(function (jqxhr, textStatus, error) {
            var err = textStatus + ", " + error;
            console.log("Request Failed: " + err);
          });
  };


  return Codelib;
});

тестовый файл codeTest.js

"use strict";
define(['src/codelib','jquery'], function(Codelib){
  var run = function(){
    QUnit.test('code should return the sum of the two supplied numbers.',function(assert){
      var codelib = new Codelib();
      assert.equal(codelib.code(1,1),2, 'The return should be 2.');
      assert.equal(codelib.code(-2,1),-1, 'The return should be -1.');
    });

    QUnit.test("As a user, I can see whether MedryBW is currently streaming on Twitch.tv",function(assert){
    var codelib = new Codelib();
    var result = codelib.gotjson();
    console.log('in test: ');
    console.dir(result);

      assert.equal(codelib.gotjson(),1, 'should be true');
    });

  };
  return {run: run}
});

ПРИМЕЧАНИЕ. Результирующий объект найден в консоли хром:

Object:
...
responseText: "{"_links":    {"self":"https://api.twitch.tv/kraken/streams/medrybw"...etc
...

Ответы

Ответ 1

В этом сообщении в конце этого самого эпического ответа автор упоминает, что просто не использует $.getJSON.

Я думаю, вы неправильно поняли эту часть ответа. Вы не можете использовать $.getJSON, если хотите, чтобы запрос Ajax был синхронным. Однако вам не нужно, чтобы запрос был синхронным. Я имею в виду, что раздел называется "Не рекомендуется: синхронный" AJAX "вызывает", я имею в виду не рекомендую, когда я это скажу:)


Вы должны использовать обратные вызовы или promises для обработки ответа, как это объяснено ранее в ответе. Там говорится, что вы должны вернуть возвращаемое значение $.getJSON (объект обещания/отложенного объекта):

Codelib.prototype.gotjson = function() {
  return $.getJSON("https://api.twitch.tv/kraken/streams/MedryBW");
};

и иметь код вызова для регистрации обратного вызова:

codelib.gotjson().done(function(result) {
  assert.equal(result, 1, 'should be true');
});

Однако QUnit ожидает, что тесты будут синхронными, поэтому он не ждет ответа Ajax. К счастью, QUnit также поддерживает асинхронные тесты:

var done = assert.async();
codelib.gotjson().done(function(result) {
  assert.equal(result, 1, 'should be true');
  done();
});