我有两个抽象的进程(例如在js对象中使用不暴露其内部的显示模块模式进行管理),它们在完成后触发自定义事件.我想在两个自定义事件都被触发时执行操作.
jQuery 1.5中新的Deferred逻辑似乎是理想的管理方式,除了when()方法接受返回promise()的deferred对象(或者正常的js对象,但是当()立即完成而不是等等,这对我来说毫无用处).
理想情况下,我想做的事情如下:
//execute when both customevent1 and customevent2 have been fired
$.when('customevent1 customevent2').done(function(){
//do something
});
Run Code Online (Sandbox Code Playgroud)
将这两种技术结合起来的最佳方法是什么?
我正在写一些使用promises的JS代码.例如,我打开一个表单弹出窗口,然后返回一个jQuery Deferred对象.它的工作原理如下:
如果用户在表单上单击"确定"并进行验证,则"延迟"将解析为表示表单数据的对象.
如果用户单击"取消",则"延迟"将解析为空.
我想要决定的是Deferred应该拒绝而不是解决?更一般地说,我想知道何时应该解决类似空对象的问题,何时应该拒绝?
这里有一些代码展示了两个位置:
// Resolve with null.
var promise = form.open()
.done(function (result) {
if (result) {
// Do something with result.
} else {
// Log lack of result.
}
});
// Reject.
var promise = form.open()
.done(function (result) {
// Do something with result.
})
.fail(function () {
// Log lack of result.
});
Run Code Online (Sandbox Code Playgroud) 我的脚本加载后,我正在发出Ajax请求以获得一些翻译.这应该总是在文档准备好后返回,因为我在页面底部加载我的脚本,但我仍然很好奇是否可以在文档就绪状态下获得延迟对象.
这样就可以确保文档准备就绪并且Ajax调用在执行任何其他操作之前成功返回,例如:
$.when( $.ajax('translations'), document.ready())
.then(function(){
// Start doing stuff here
});
Run Code Online (Sandbox Code Playgroud) 我想创造我认为被称为"瀑布"的东西.我想顺序处理一系列异步函数(jQuery promises).
这是一个人为的例子:
function doTask(taskNum){
var dfd = $.Deferred(),
time = Math.floor(Math.random()*3000);
setTimeout(function(){
console.log(taskNum);
dfd.resolve();
},time)
return dfd.promise();
}
var tasks = [1,2,3];
for (var i = 0; i < tasks.length; i++){
doTask(tasks[i]);
}
console.log("all done");
Run Code Online (Sandbox Code Playgroud)
我希望它按照它们执行的顺序完成任务(存在于数组中).因此,在这个例子中,我希望它执行任务1并等待它解决然后执行任务2等待它解决,执行任务3等并且日志"全部完成".
也许这是非常明显的,但我一直试图在整个下午解决这个问题.
我有一个返回jQuery承诺的函数.它看起来像这样:
addBooks(books: Array<Books>) {
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
Run Code Online (Sandbox Code Playgroud)
我这样做,所以我可以重用这个函数和链承诺回调,如:
addBooks.done(() => { alert("Books added!"); })
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我想尽早摆脱addBooks并阻止访问服务器该怎么办?例如:
addBooks(books: Array<Books>) {
// An empty array was passed in for some reason.
// Theres nothing to add so dont try to POST
if (books <= 0) return null;
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
Run Code Online (Sandbox Code Playgroud)
我的示例将无法编译,因为我的链式完成回调示例期望addBooks返回一个promise对象,而不是null.我怎样才能返回一个空的承诺(或者在这种情况下我应该返回的正确对象)?
为了使Web应用程序响应,您使用异步非阻塞请求.我可以设想两种方法来实现这一点.一种是使用延迟/承诺.另一个是网络工作者.对于Web工作者,我们最终会引入另一个进程,并且我们不得不来回传输数据.我正在寻找某种性能指标来帮助理解何时选择简单的非阻塞回调而不是Web worker.
是否有某种方法可以使用哪种方法而无需对这两种方法进行原型设计?我在网上看到很多关于网络工作者的教程,但我没有看到很多成功/失败的故事.我所知道的是我想要一个响应式应用程序.我正在考虑使用Web worker作为内存数据结构的接口,该数据结构可以是0.5-15MB(本质上是数据库),用户可以查询和更新.
据我了解javascript处理,可以执行单个长时间运行的任务并对其进行切片,以便定期进行控制,从而允许其他任务处理一段时间.这会是使用网络工作者的标志吗?
我想将[1,n]个AJAX请求发送到服务器,并且在返回结果之后,应该关闭模式对话框.$.when(a(), b(), c())会很完美,但我不知道如何将函数的变量计数$.when作为参数传递.任何想法如何解决这个问题?
我一直在阅读关于jQuery中的延迟和承诺,但我还没有使用它.
我已经很好地理解了一切,但方法管道.我真的没有得到它是什么.
有些人可以帮助我理解它的作用以及它可以在哪里使用?
我知道有一个标题与这个(这里)完全相同的问题,但它不一样.我正在寻求帮助以理解它和一些例子.另一个问题的目的是弄清楚它在特定情况下不起作用的原因.
我有一个页面,使用被称为100次的jQuery .ajax(async:true),问题是,当它们全部被加载时,我需要系统在继续之前等待所有100个调用返回.我该怎么做?
提前致谢!:)
更新:
这些调用是在for()循环中进行的(其中有100个:))
我的情况是我的ajax调用必须按特定顺序执行.我在其他情况下使用过jQuery Deferred对象,但似乎无法找到使这种行为适当的方法.
我有一个函数,它ajax在它的生命周期中执行许多请求.某些请求将在成功回调其他请求期间执行.
我的问题:有没有办法将所有嵌套的延迟对象返回到原始$.when调用?
一个简化的例子是:
function nestedAjax() {
$.get("/", function(){
console.log("First ajax done.");
$.get("/", function(){
console.log("Second ajax done.");
});
});
};
Run Code Online (Sandbox Code Playgroud)
我试图nestedAjax使用这个功能,$.when()并$.done()喜欢这样:
$.when(nestedAjax()).done(function(){
console.log("Complete");
});?
Run Code Online (Sandbox Code Playgroud)
控制台输出读数:
> First ajax done.
> Second ajax done.
> Complete.
Run Code Online (Sandbox Code Playgroud)
我可以返回第一个get实现这个目的:
> First ajax done.
> Complete.
> Second ajax done.
Run Code Online (Sandbox Code Playgroud)
但显然这不是我要求的.任何帮助,将不胜感激.
jquery-deferred ×10
jquery ×9
javascript ×7
ajax ×3
promise ×3
asynchronous ×1
jquery-1.5 ×1
typescript ×1
waterfall ×1
web-worker ×1