Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 量角器:使用api调用的结果_Javascript_Ajax_Http_Promise_Protractor - Fatal编程技术网

Javascript 量角器:使用api调用的结果

Javascript 量角器:使用api调用的结果,javascript,ajax,http,promise,protractor,Javascript,Ajax,Http,Promise,Protractor,我创建了一个小api来动态生成测试数据。每次调用都会创建一个新用户并返回创建的数据 要加载数据,我使用包请求: var flow = protractor.promise.controlFlow(); var result = flow.execute(function() { var defer = protractor.promise.defer(); request('http://localhost/test/recipe/person', function (error

我创建了一个小api来动态生成测试数据。每次调用都会创建一个新用户并返回创建的数据

要加载数据,我使用包
请求

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {
    var defer = protractor.promise.defer();
    request('http://localhost/test/recipe/person', function (error, response, body) {
        if (!error && response.statusCode === 200) {
            defer.fulfill(JSON.parse(body));
        }
    });
    return defer.promise;
});
要使用检索到的数据,我必须解析承诺并在回调中继续测试脚本:

result.then(function(data) {
    element(by.model('username')).sendKeys(data.person.email);
    element(by.model('password')).sendKeys('test');
    $('button[type="submit"]').click();
});
我不喜欢这种回调处理方式,也不喜欢它可能导致的地狱。除此之外,量角器很好地隐藏了这个混乱的回调处理。因此,问题是:

如何使用异步调用的结果?

最后,我希望执行如下代码:

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {...});

element(by.model('username')).sendKeys(result.person.email);
//...

有什么想法吗?

您可以使http请求同步—在大多数情况下,这是一件不好的事情。
或者,您可以将回调插入execute函数:

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {
    var defer = protractor.promise.defer();
    request('http://localhost/test/recipe/person', function (error, response, body) {
        if (!error && response.statusCode === 200) {
            defer.fulfill(JSON.parse(body));
        }
    });

    defer.promise.then(function(data) {
       element(by.model('username')).sendKeys(data.person.email);
       element(by.model('password')).sendKeys('test');
       $('button[type="submit"]').click();
    });

    return defer.promise;
});
但结果将是一个承诺。

它对我起了作用:

var request = require('request');

var options = {
  method: 'POST',
  url: 'http://testurl.com/endpoint/test/',
  headers: {'id': 'ABCD',
    'sessionid': 'dummyId',
    'Accept': 'application/json',
    'Accept-Language': 'en-us'
  },
  body: '{ "pay_load": [] }'
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(body);
    console.log(info);
  }
}

request(options, callback);

作为重复结束-简短的回答:你真的不能以一种好的方式结束,如果你这样做,它会大大降低你的测试速度,而且它们在性能方面会表现得不可靠。长答案在重复的问题中。如果你觉得我找到的副本不包括你的问题(我相信它确实包括),请告诉我,我会重新打开它。@BenjaminGruenbaum:我认为这不是一个完全相同的副本。不同的是进行ajax调用的环境。一方面,您有一个事件驱动的客户端,其中阻塞IO意味着阻塞UI。另一方面,您有一个测试执行框架,它的关键功能是在一行中执行后续异步调用,就像同步调用一样。根据您自己的情况,我认为这里的核心问题完全相同,但我已经重新打开了它