2016-05-20 4 views
-1

Я использую стажер JS/тестирование тестовой среды. Я использую executeAsync. Я ожидаю, что возвращаемое значение из executeAsync будет передано в callback для executeAsync, но этого не происходит. Должны ли следующие работы?executeAsync не передает возвращаемое значение обратному вызову

return this.remote.get(require.toUrl(url)); 
    //do stuff 
    .executeAsync(function (done) { 

     require([<library>], 
      function ([<function>]) { 
       return <function which returns Promise> 
       .then(function (value) { 
        return <function which returns Promise> 
       ... 
       }).then(function() { 
        done(window.location); 

       }) 
      }) 

    }) 
    .then(function (loc) { 
     console.log(loc); 
    }) 

Выполнение выполнено до последнего обратного вызова в executeAsync успешно. Обратный вызов executeAsync называется успешно. Но значение, переданное обратному вызову executeAsync, равно undefined.

Edit: Я обнаружил, что даже если установить тайм-аут executeAsync очень большого числа, этот тайм-аут будет игнорироваться, если вы не вызываете this.async(timeout), указав правильный тайм-аут (по умолчанию 30 секунд во время письмо). Таким образом, проблема заключалась в том, что тест занимал более 30 секунд, и значение, переданное на выполнение, не превратило его в callback для executeAsync.

ответ

2

executeAsync использует обратный вызов, чтобы определить, когда его функция завершена. Этот обратный вызов автоматически передается в качестве последнего аргумента (единственный аргумент, если вы не передаете что-нибудь еще) к функции executeAsync:

define([ 
    'require', 
    'intern!object' 
], function (
    require, 
    registerSuite 
) { 
    registerSuite({ 
     name: 'test', 

     foo: function() { 
      return this.remote.get(require.toUrl('./index.html')) 
       .setExecuteAsyncTimeout(5000) 
       .executeAsync(function (done) { 
        var promise = new Promise(function (resolve) { 
         setTimeout(function() { 
          resolve(); 
         }, 1000); 
        }); 

        promise.then(function() { 
         return new Promise(function (resolve) { 
          setTimeout(function() { 
           resolve(); 
          }, 1000); 
         }); 
        }).then(function() { 
         done(window.location); 
        }); 
       }) 
       .then(function (loc) { 
        // This prints out a full location object from the 
        // browser. 
        console.log(loc); 
       }); 
     } 
    }); 
}); 
+0

Я реализовал его, поскольку у вас есть код здесь, но 'value' для меня по-прежнему' undefined'. Что такое «сделано»? – cosmosa

+0

Как я уже сказал, функция 'executeAsync' автоматически передает обратный вызов в качестве последнего аргумента. Этот обратный вызов, который вы можете вызывать независимо от того, что вы хотите (я обычно называю его «done»), должен быть вызван вашей функцией 'executeAsync', когда он закончит все, что он делает. Вы не можете вернуть обещание от функции 'executeAsync' (ну, вы можете, но Интерн не обратит на это внимания). Функция «executeAsync» будет запущена в браузере, где обещания могут быть недоступны, поэтому Intern использует обратный вызов, а не обещание получить его возвращаемое значение. – jason0x43

+0

Итак, после передачи функции 'done' в параметр' script', переданной в 'executeAsync', а затем вызывая' done' в качестве последнего шага в 'executeAsync', чтобы сообщить, что он завершил выполнение, я ожидал бы, что значение передается обратному вызову 'executeAsync' (' значение' в этом случае) для значения, переданного 'done'. Но 'value' по-прежнему' undefined'. – cosmosa

0

В соответствии с Лэдфут документов здесь

https://theintern.github.io/leadfoot/module-leadfoot_Command.html#executeAsync

Возвращает

Значение, возвращенное удаленного кода. Можно вернуть только значения, которые могут быть сериализованы для JSON, а также элементы DOM.

Что вы возвращаете из выполненной функции?

+0

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

+0

@ cosmos1990 вы уверены? похоже, что вы действительно можете вернуть обещание, которое в конечном итоге решит массив. определенно, не одно и то же. –

+0

Это может быть. В любом случае, я теперь передаю функцию обратного вызова и вызывая ее вместо того, чтобы возвращать значение, как предположил @ jason0x43. – cosmosa