有没有一种方法可以在一个准确的时间实现一个承诺
Is there a way to fulfill a promise at an exact time?
我有一个有过渡的网页,点击一切都转到opacity:0
(1秒持续时间),然后一个新页面交换,一切都转到opacity:1
(1秒持续时间)
如果页面没有1秒的时间来隐藏和显示,最终看起来会很奇怪。此外,如果页面没有立即在两者之间交换,它看起来是奖励的。
这是我的第一个代码
$('#main').css('opacity', '0');
setTimeout(function(){
$('#main').load('/views/'+name+'.html').css('opacity', '1')
}, 1000);
然而load()有时需要很长时间来抓取视图,并且由于css是立即实现的,当它交换时,不透明度已经是1
。
所以我试了这个:
$.get('/views/'+name+'.html', function(page){
setTimout(function(){
$('#main').html(page).css('opacity', '1')
},1000);
})
但是现在如果$.get()是缓慢的,页面是空白太长时间。理想情况下,我想知道多长时间的承诺履行,并从setTimeout时间减去。我现在想,我必须手动创建一个新的日期对象,并检查承诺履行后的差异。
有更好的解决方案吗?
我忘了我可以只使用promise。
var pagePromise = $.get('/views/'+name+'.html')
$('main').css('opacity', '0')
setTimeout(function(){
pagePromise.then( function(page){
$('main').html(page).css('opacity', '1') }
)
},1000)
请在请求前后安排时间。这可能不准确,但在大多数情况下,可以很容易地忽略误差范围,包括您的。
var time = Date.now();
$.get('/views/' + name + '.html', function(page) {
var elapsed = Date.now() - time;
setTimout(function() {
$('#main').html(page).css('opacity', '1')
}, 1000 - elapsed);
})
您可以使用Date.now()
并计算差值
var start = Date.now();
$.get('/views/' + name + '.html', function(page) {
setTimout(function() {
$('#main').html(page).css('opacity', 1);
}, 1000 - (Date.now() - start));
});
很难确切地说出您要完成的内容,但尝试遵循您的逻辑,似乎您希望新内容在隐藏旧内容后的一秒钟内显示,除非内容需要比加载时间更长,在这种情况下,它在加载时显示。你可以把这个过程分成几个步骤来完成。
- 记录启动时间
- 使用ajax获取您的内容
- 当内容被获取时,检查已经过了多少时间。
- 如果超过一秒,则插入内容并显示。
- 如果不到一秒的时间,那么设置一个计时器,然后在计时器触发时显示内容。
你可以这样实现这个逻辑:
var begin = Date.now();
var main = $('#main').css('opacity', '0');
$.get('/views/'+name+'.html').then(function(content) {
main.html(content);
var elapsed = Date.now() - begin;
if (elapsed > 1000) {
// show it now
main.css('opacity', '1');
} else {
setTimeout(function(){
// show it when 1 second has finished
main.css('opacity', '1');
}, 1000 - elapsed);
}
});
使用这种通知和时间度量方案,就不需要猜测加载时间。
您可以使用ajax来使代码同步。
jQuery.ajax({
url: '/views/'+name+'.html',
success: function (result) {
$('#main').html(page).css('opacity', '1');
},
async: false,
type: "GET"
});
相关文章:
- 实现一个建立在google.com之上的自定义搜索引擎
- 一个承诺换多个承诺-并发问题
- 有没有一条清晰的路径,我可以实现一个在 ScalaJS + React 中广泛使用上下文的 React 组件
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 使用ajax和jquery ui滑块实现一个下拉框
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 我正在尝试实现一个AJAX调用.我做错了什么
- 在节点中,使用Q,使两个函数并行工作,但只等待第一个函数实现其承诺
- 如何通过Bluebird承诺您自己的javascript api,该api使用另一个承诺的api
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 如何在网站上实现一个按钮,允许用户将生成的数组数据保存为ASCII文件
- 做一些 ajax 并使用 getJSON 返回一个承诺
- 在 AngularJS 中声明一个承诺,并带有命名的成功/错误回调
- 链承诺.all 与从上一个承诺返回的数组.all.
- 如何更好地停止一个承诺链并开始另一个承诺链
- 我如何从forEach循环中实现一个扁平的承诺数组?
- 尝试在Reactjs中实现一个简单的承诺
- 让javascript函数与回调/承诺实现总是返回一个承诺
- 有没有一种方法可以在一个准确的时间实现一个承诺