Cómo crear y manipular promesas en Transportador?


Quiero usar el módulo Http de Nodo para llamar a mi servidor directamente con el fin de configurar mis pruebas de Transportador. Http está basado en callback y quiero convertirlo en promesas.

Por ejemplo, quiero que esta función devuelva la promesa:

function callMyApi() {
  var promise = // somehow create promise;

  http.request({path: '/yada/yada', method: 'POST'}, function(resp) {
    promise.complete(resp);
  });

  return promise;
}

Entonces, la pregunta es: ¿qué necesito require() y poner en lugar de "de alguna manera crear promesa" para que esto funcione?

Author: Konrad Garus, 2014-01-11

2 answers

Protractor utiliza las promesas de WebDriver y expone esa API globalmente en 'protractor'. Así que usted debe ser capaz de hacer

var deferred = protractor.promise.defer();
return deferred.promise;

Para ver la API Promise de WebdriverJS completa, consulte el código en https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js

 59
Author: Jmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 22:27:28

Esta es la manera incorrecta de hacer esto, pero saber sobre el Flujo de Control del Transportador podría ayudar. Si desea ejecutar Javascript regular en orden Transportador, agréguelo a través del flujo de control.

En este caso, podría usar su propia biblioteca de promesas si lo desea, entonces simplemente use browser.wait para esperar a que sus promesas se completen.

var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() {
    var p = new Promise...
    promises.push(p);
});
browser.wait( function(){ return Promise.all(promises); }, timeoutMs );

Uso esto no para promesas regulares, sino para console.log declaraciones o hacer tiempo para una parte de una prueba, o incluso usar fs para imprimir algo en una prueba a un archivo.

var startTime, duration; 
browser.controlFlow().execute(function() {
    startTime = new Date().getTime();
});
//Protractor code you want timed
browser.controlFlow().execute(function() {
    duration = new Date().getTime() - startTime;
    console.log("Duration:", duration);
});
 2
Author: mvndaai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-16 05:19:53