【发布时间】:2013-07-30 11:56:35
【问题描述】:
我有很多目前看起来像这样的函数:
function LoadFromURL(url)
{
var d = $.Deferred();
$.get(url).then(function(text)
{
LoadFromText(text).then(function(obj)
{
d.resolve(obj);
},
function(err)
{
d.reject(err);
});
},
function(err)
{
d.reject(err);
});
return d.promise();
}
这个函数接受一个 URL 并加载一个 Promise 中的文本。然后将文本传递给 LoadFromText 函数,该函数返回另一个承诺。如果成功,则外部延迟被解决。如果无法加载 URL,或者 LoadFromText 函数失败,则外部延迟被拒绝。
有没有一种方法可以链接解决/拒绝的结果并最终得到如下结果:
function LoadFromURL(url)
{
return $.get(url).then(function(text)
{
return LoadFromText(text);
},
function(err)
{
return $.Deferred().reject(err);
}).promise();
}
我已经看到了一些允许这样做的承诺的实现——在“then”中返回一个承诺,意味着使用了承诺的最终结果。
我意识到目前这不起作用(结果是承诺,而不是承诺的结果),但希望有人可以提出一种方法来使这项工作,这样我就可以整理有时令人困惑的混乱第一个例子。
我希望这是有道理的。谢谢。
【问题讨论】:
-
jQuery 的 Deferred 的
then方法与我使用的其他 Promise 库有点不同。它更适合用作过滤器。 (当然,你可以将它用于任何你想要的东西。)看看.when()。如果这不能满足您的要求,那么您的第一个代码块看起来就像我解决这个问题的方式。或者,包括 Async.js 什么的。
标签: jquery jquery-deferred deferred