我正在使用请求库。我有一系列URL(var资源),我想用这些URL的文本内容填充。
我的代码如下所示:
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="true">
<Setter TargetName="row2" Property="Height" Value="Auto"/>
<Setter TargetName="border" Property="Height" Value="Auto"/>
<Setter Property="Height" Value="Auto"/>
<Setter TargetName="border" Property="BorderThickness1" Value="1 1 0 0"/>
<Setter TargetName="border" Property="BorderThickness2" Value="1 1 0 0"/>
<Setter TargetName="border" Property="BorderThickness3" Value="1 1 0 0"/>
<Setter TargetName="border" Property="BorderThickness4" Value="1 1 0 0"/>
<Setter TargetName="border" Property="BorderThickness5" Value="1 1 0 0"/>
<Setter TargetName="headercontent" Property="Padding" Value="3 2 0 0"/>
</Trigger>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="false">
<Setter TargetName="row2" Property="Height" Value="0"/>
<Setter TargetName="border" Property="Height" Value="35"/>
<Setter Property="Height" Value="35"/>
<Setter TargetName="border" Property="BorderThickness1" Value="0"/>
<Setter TargetName="border" Property="BorderThickness2" Value="0"/>
<Setter TargetName="border" Property="BorderThickness3" Value="0"/>
<Setter TargetName="border" Property="BorderThickness4" Value="0"/>
<Setter TargetName="border" Property="BorderThickness5" Value="0"/>
<Setter TargetName="headercontent" Property="Padding" Value="0 2 0 0"/>
</Trigger>
</ControlTemplate.Triggers>
问题是resourceToText()在fetch()有时间填充它之前返回数组。因此,resourcesText最终为空。我认为更高阶函数是为了解决这类问题,但我无法理解一种方法来处理回调。
解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
通过以下方式从resourcesToText
创建异步函数:
使用其他回调:
function resourcesToText(resources, callback) {
var text = [],
requestCount = resources.length;
for (var i in resources) {
request(resources[i], fetch);
}
function fetch(error, response, body) {
if (!error) {
text.push(body);
} else {
console.log('Sorry. I couldn\'t parse that resource. ' + error);
}
requestCount--;
if(requestCount <= 0){
callback(text);
}
}
};
使用计数器(text
)获得所有请求结果后,使用结果requestCount
调用回调。
现在对resourcesToText
的调用如下:
resourcesToText(resources, function(text){
...
});
使用延期/承诺
您还可以实现延迟/承诺的概念,而不是使用回调。那里有很多库,比如q(https://github.com/kriskowal/q)