Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Dart HttpClient.getUrl由计时器在没有客户端或http服务器的情况下调用_Dart_Server Side_Dart Async - Fatal编程技术网

Dart HttpClient.getUrl由计时器在没有客户端或http服务器的情况下调用

Dart HttpClient.getUrl由计时器在没有客户端或http服务器的情况下调用,dart,server-side,dart-async,Dart,Server Side,Dart Async,编辑:问题与计时器或HttpServer无关,是dart.io睡眠功能暂停了所有操作。文档中清楚地描述了这一点,我的不好 // 我有一个奇怪的问题,HttpClient在服务器代码中工作。我打电话 client.getUrl(Uri.parse(url))。然后((HttpClientRequest响应)=>response.close())。然后(HttpBodyHandler.processResponse)。然后((HttpClientResponseBody){ 打印(body.resp

编辑:问题与计时器或HttpServer无关,是dart.io睡眠功能暂停了所有操作。文档中清楚地描述了这一点,我的不好

//

我有一个奇怪的问题,HttpClient在服务器代码中工作。我打电话

client.getUrl(Uri.parse(url))。然后((HttpClientRequest响应)=>response.close())。然后(HttpBodyHandler.processResponse)。然后((HttpClientResponseBody){
打印(body.response.statusCode);
从计时器对象开始,它永远不会到达打印步骤。 它几乎是复制和粘贴上一个版本的代码,它不是从Timer调用的,而是从HttpRequest调用的。 它在长线上失败了,我怀疑这是它永远无法到达的最后一个未来(HttpClientResponseBody)

计时器对象的创建方式如下(仅测试代码):

main(){
t=新计时器。周期(新的持续时间(分钟:周期),(计时器t=>hit());
}
无效命中(){
if(new DateTime.now().hour==17){
打印(“同步摇滚”);
loadUrlBody(卷起+过滤)。然后((内容){
打印(“加载内容”);
//编辑: 好的,这是来源,可能是一些琐碎的问题。我两天都没能弄清楚

导入'dart:async';
导入“dart:io”;
导入“包:http_server/http_server.dart”;
导入“包装:松弛/松弛省道”作为松弛;
定时器t;
布尔检查;
最后期限=1;
final furl=“https://**.tpondemand.com”;
final filter=“somefilter”;
main(){
t=新计时器。周期(新的持续时间(分钟:周期),(计时器t=>hit());
}
无效命中(){
if(new DateTime.now().hour==17){
打印(“同步摇滚”);
loadUrlBody(卷起+过滤)。然后((内容){
打印(“加载内容”);
Map parsedMap=content.body;
handleMap(parsedMap);
});
睡眠(新的持续时间(分钟:60));
}否则{
打印(“没有时间摇滚”+new DateTime.now().toString());
睡眠(新的持续时间(分钟:周期*10));
}
}
未来加载url正文(字符串url){
最终c=新的完成符();
HttpClient=新的HttpClient();
client.addCredentials(Uri.parse(“https://**.tpondemand.com/api”)、“tprealm”、新的HttpClientBasicCredentials(“用户”、“密码”);
client.getUrl(Uri.parse(url))。然后((HttpClientRequest响应)=>response.close())。然后(HttpBodyHandler.processResponse)。然后((HttpClientResponseBody){
打印(body.response.statusCode);
c、 完整的(身体);
});
返回c.未来;
}
void send2Slock(字符串m){
slack.Message Message=新slack.Message()…text=m;
slack.token='token';
slack.team='team';
松弛。发送(消息);
}
void handleMap(映射值映射){
最终持续时间lostInTime=新的持续时间(天:30);
var sb=新的StringBuffer();
某人写('kompost\n');
对于(valueMap[“项目”]中的var项目){
如果(项['CreateDate']==null)项['CreateDate']='/Date(1403167885000+0100)/';
如果(项目['ModifyDate']==null)项目['ModifyDate']='/Date(1403167885000+0100)/';
如果(项目['LastCommentDate']==null)项目['LastCommentDate']='/日期(1403167885000+0100)/';
DateTime moonLanding=new DateTime.froms毫秒新纪元(int.parse(item['CreateDate'].substring(6,19));
DateTime modifyLanding=new DateTime.froms毫秒新纪元(int.parse(item['ModifyDate'].substring(6,19));
DateTime commentLanding=new DateTime.From毫秒新纪元(int.parse(item['LastCommentDate'].substring(6,19));
DateTime lastChangeLanding=(modifyLanding.isBefore(commentLanding))?commentLanding:modifyLanding;
持续时间差异=新的DateTime.now()差异(lastChangeLanding);
if(moonLanding.add(lostInTime).isBefore(new DateTime.now())&&difference.inDays>4){
某人
..写入('last change:')
..写(差分.天)
..写('days ago\n');
}
;
}
send2Slack(sb.toString());
打印(“发送到Slack”);
(某人清楚地);
}

我创建了类似的代码,但无法重现您的问题。
因此,当从
计时器调用时,基本上这是可行的

导入'dart:io';
导入“dart:async”;
导入“包:http_server/http_server.dart”;
定时器t;
最后期限=1;
空干管(args){
t=新计时器。周期(新的持续时间(分钟:周期),(计时器t=>hit());
}
无效命中(){
loadUrlBody('http://www.google.com')
.then((HttpClientResponseBody b)=>print('hit:${b.response.statusCode}');
}
未来加载url正文(字符串url){
打印(“执行”);
HttpClient=新的HttpClient();
//注释掉了,因为我没有可以使用它的服务器
//HttpClient=新的HttpClient()
//…addCredentials(Uri.parse(“https://**.tpondemand.com/api”),“tprealm”,新的HttpClientBasicCredentials(“用户”,“密码”);
返回client.getUrl(Uri.parse(url))//response.close()
.then(HttpBodyHandler.processResponse)
.然后((HttpClientResponseBody主体){
打印($body:(${new DateTime.now()})${body.response.statusCode});
返回体;//doSomething(x));
});
}
您不需要使用
完成符
。完成符用于更复杂的用例,例如一个方法返回一个完成符,例如一个eventHandler完成它


您只需确保在任何地方都返回一个
未来
然后
始终返回一个
未来
。返回的
未来
的值是
然后
内返回的值。您的代码片段似乎有点断开。您能创建一个最小的代码示例来重现问题吗你从
Timer
getUrl
不起作用,但是你从
Timer
调用
hit()
。我想你忘记了一些
return
或类似的简单疏忽,但很难从你的代码中分辨出来。更新后的代码更好,但你应该把它精简到最低限度