Tag: promise

如何确定已读取所有文件并解决承诺

以下代码负责读取文件。 我的要求是如何查找是否已读取所有文件,以便我可以从父函数(readmultifiles)返回或解析promise。 $.when(readmultifiles(files)) .then(function(){//all files uploaded})) 上面的代码启动文件读取。 可以做什么,以便在读取所有文件时完成回调或可以返回。 function readmultifiles(files) { // Read first file setup_reader(files, 0); } function setup_reader(files, i) { var file = files[i]; var name = file.name; var reader = new FileReader(); reader.onload = function(e) { readerLoaded(e, files, i, name); }; reader.readAsBinaryString(file); // After reading, read the next file. } function readerLoaded(e, […]

Jquery承诺链

我有一个简单的事件链: 从metaData表中获取列(异步) 加载选定的列(异步) 渲染列表 我曾经只是链接这些函数,每个函数在完成后调用它们。 然而,它不是很明显(在填充视图时调用getColumnsFromMeta结果)。 因此,为了清晰和重用代码,我想使用JQuery Promises重构它们。 我之前使用过承诺。 但是我如何连锁超过两个? getColumnsFromMeta ().then(loadSourceFromDatabase /*some arguments*/) //.then(renderList)?; 以下是getColumnsFromMeta的示例: var getColumnsFromMeta = function(id) { var sql, dfd; dfd = $.Deferred(); var onSuccess = function(tx, result) { var columns = []; for (var i = 0; i < result.rows.length; i++) { columns.push(result.rows.item(i).Column); } dfd.resolve(columns); }; var onError = function(tx, […]

jQuery延迟对象与嵌套的ajax调用

我的情况是我的ajax调用必须按特定顺序执行。 我在其他情况下使用过jQuery Deferred对象,但似乎无法找到使这种行为适当的方法。 我有一个函数,它在它的生命周期中执行许多ajax请求。 某些请求将在成功回调其他请求期间执行。 我的问题: 有没有办法将所有嵌套的延迟对象返回到原来的$.when调用? 一个简化的例子是: function nestedAjax() { $.get(“/”, function(){ console.log(“First ajax done.”); $.get(“/”, function(){ console.log(“Second ajax done.”); }); }); }; 我想让nestedAjax函数使用$.when() nestedAjax $.when()和$.done()如下所示: $.when(nestedAjax()).done(function(){ console.log(“Complete”); });​ 控制台输出读数: > First ajax done. > Second ajax done. > Complete. 我可以返回第一个实现此目的: > First ajax done. > Complete. > Second ajax done. 但显然这不是我要求的。 任何帮助,将不胜感激。

以编程方式创建jQuery承诺的链式序列

我有一个函数通过在列表中的每个文件上调用单个deleteFile(filePath)来删除列表中的文件数组filePaths(我正在使用的一些APIS不支持批量删除)。 函数deleteFile返回jQuery promise并在删除文件时解析/拒绝。 function deleteFiles(filePaths) var deferreds = $.map(fileKeys, function (val, index) { return deleteFile(filePath); }); $.when.apply($, deferreds).then(function (schemas) { console.log(“DONE”, this, schemas); deferred.resolve(); }, function (error) { console.log(“My ajax failed”); deferred.reject(error); }); 我得到.reject调用列表中的一些文件(我知道它们存在),所以我想我可能需要将filePaths数组变成一个链接的调用,比如一个队列(b / c这个不是什么$。什么,是吗?它似乎立刻启动它们)。 我知道如何做到这一点(如.deleteFile(path1).deletePath(path2)等等,当它们在这样的数组中时。 任何帮助都提前得到赞赏。

jQuery Deferred and Promise用于顺序执行同步和异步函数

如果我希望以特定的顺序执行同步和异步函数,我可以使用jQuery承诺,但它似乎不像我期望的那样工作。 函数a,b和c应该在调用deferred.resolve()时以该顺序执行我希望函数b被执行但是无论是否调用了resolve,所有函数都会立即执行。 这是代码: function a(){ var deferred = $.Deferred(); setTimeout(function(){ console.log(“status in a:”,deferred.state()); //this should trigger calling a or not? deferred.resolve(“from a”); },200); console.log(“a”); return deferred.promise(); }; function b(){ var deferred = $.Deferred(); setTimeout(function(){ console.log(“status in b:”,deferred.state()); deferred.resolve(“from b”); },200); console.log(“b”); return deferred.promise(); } //synchronous function function c(){ var deferred = $.Deferred(); console.log(“c”); console.log(“status in […]

使用jQuery加载promises

我仍然试图绕过deferred而不是什么,所以考虑到这一点,我有一个关于如何做以下事情的问题。 我的团队和我有3个单独的.load()方法,每个方法都抓取一个特定的模板并将其附加到同一个容器中。 每个负载都会花费不同的时间,因此当内容加载时,它会以“阶梯式”方式加载(1,然后是2,然后是3)。 我想使用deferred对象并等待它们全部完成,然后同时附加它们以删除“阶梯”动作。 $(”).load(baseInfoTemplate, function () { var baseData = { // build some object }; $.tmpl(this, baseData).appendTo($generalContainer); }); 所有三个电话都与上面的电话类似。 我怎样才能做到这一点?

有没有办法在ie9 +中实现承诺

我试图在IE9 +上实现本机承诺 ,似乎Internet Explorer不识别“Promise”类/对象。 我在http://caniuse.com/#search=Promise中搜索并看到IE没有Promise对象。 但这很奇怪,因为jQuery和Angular可以使用promise并在IE9 +中工作。 也许他们正在实施自己的承诺? **我可以实现自己的承诺吗?**

$ .Deferred:如何检测每个承诺何时执行

我有许多需要完成的异步任务,所以我使用的是promises。 我需要检测每个承诺何时被执行(解决和拒绝)。 在此之前我不能继续执行。 我使用的是这样的东西: $.when(promise1, promise2, …).always(); 但是这段代码是错误的,因为when方法具有惰性求值,并且只要其中一个promise失败就会返回。 因此,只要其中一个承诺失败, always回调也会运行。 我正在考虑编写一个变通方法,但是这个用例很常见,可能有人已经完成了,或者甚至有一种方法可以使用jQuery(如果没有,添加Promise.whenNonLazy或者很好) Promise.when(promise1, promise2, …, false) 。 这可能吗?