Javascript 总是成功的jQuery承诺?
我有以下代码jQuery代码片段:Javascript 总是成功的jQuery承诺?,javascript,jquery,promise,Javascript,Jquery,Promise,我有以下代码jQuery代码片段: $.get('/api/' + currentPage).done(function(data) { ... }) .fail(...) 我想用一个始终成功并为数据返回特定值的承诺来替换$.get('/api/'+currentPage)。比如: let myData = { ... } // value of data I want to pass to the done function (ne
$.get('/api/' + currentPage).done(function(data) { ... })
.fail(...)
我想用一个始终成功并为数据返回特定值的承诺来替换$.get('/api/'+currentPage)
。比如:
let myData = { ... } // value of data I want to pass to the done function
(new AlwaysSucceeds(myData)).done(function(data) { ... })
.fail(...)
我可以拼凑出一个虚拟对象,或者我可以提取出done
函数,但我希望将对代码的更改保持在最低限度
有办法做到这一点吗
更新:为了帮助澄清发生了什么,我正在使用的代码是。通常,这个应用程序是由一个nodejs服务器提供的,该服务器实现了/api/…
调用,但我正在将它转换为服务
从静态页面服务器。我知道什么东西会被退回
$.get
调用。为了保持对代码的更改干净,我只想
将该行更改为:
let myData = {...}
// $.get('/api/' + currentPage) -- comment out the $.get call
(SOMETHINGHERE(myData)).done(function(data) {
这里的something
表达式需要实现.done(f)
它将使用myData
调用函数f
,然后返回
一些实现了.fail(…)
的对象什么都不做。您可以通过实现始终使用的构造函数来实现这一点。请看下面的例子
功能始终成功(数据){
这个数据=数据;
}
AlwaysAcceeds.prototype.done=功能(fn){
fn(本数据);
归还这个;
}
AlwaysAcceeds.prototype.fail=功能(fn){
归还这个;
}
var myData={
a:1
};
(新的AlwaysAcceeds(myData)).done(函数(数据){
console.log(数据)
}).fail(函数(数据){
})
您可以通过实现AlwaysSucceeds
构造函数来实现这一点。请看下面的例子
功能始终成功(数据){
这个数据=数据;
}
AlwaysAcceeds.prototype.done=功能(fn){
fn(本数据);
归还这个;
}
AlwaysAcceeds.prototype.fail=功能(fn){
归还这个;
}
var myData={
a:1
};
(新的AlwaysAcceeds(myData)).done(函数(数据){
console.log(数据)
}).fail(函数(数据){
})
由于jQuery Ajax函数只返回对象,因此您只需替换一个立即解析的延迟的:
$.Deferred().resolve(myData).then(...)
在这种特殊情况下,如果您想在同步和异步代码之间轻松切换,并且您可以访问async
/wait
,您可以直接使用这些代码:
try {
const data = await Promise.resolve($.get('/api/' + currentPage));
// code in done
} catch (err) {
// code in fail
}
将成为
try {
const data = myData;
// code in done
} catch (err) {
// code in fail (never runs unless other code throws exceptions)
}
由于jQuery Ajax函数只返回对象,因此您只需替换一个立即解析的延迟的:
$.Deferred().resolve(myData).then(...)
在这种特殊情况下,如果您想在同步和异步代码之间轻松切换,并且您可以访问async
/wait
,您可以直接使用这些代码:
try {
const data = await Promise.resolve($.get('/api/' + currentPage));
// code in done
} catch (err) {
// code in fail
}
将成为
try {
const data = myData;
// code in done
} catch (err) {
// code in fail (never runs unless other code throws exceptions)
}
您只需将$.get(…)
替换为一个函数,该函数返回一个已使用您已有的数据解析的承诺。并且,获得已解析的jQuery承诺(使用特定值解析)的最短方法是:
$.when(myData).done(...)
在jQuery中实现这一点的更多的教科书方法是:
$.Deferred().resolve(myData).done(...)
而且,如果您想将逻辑切换到ES6标准(而不是非标准的jQuery承诺行为),那么您可以使用以下方法:
Promise.resolve(myData).then(...).catch(...)
您只需将$.get(…)
替换为一个函数,该函数返回一个已使用您已有的数据解析的承诺。并且,获得已解析的jQuery承诺(使用特定值解析)的最短方法是:
$.when(myData).done(...)
在jQuery中实现这一点的更多的教科书方法是:
$.Deferred().resolve(myData).done(...)
而且,如果您想将逻辑切换到ES6标准(而不是非标准的jQuery承诺行为),那么您可以使用以下方法:
Promise.resolve(myData).then(...).catch(...)
我们不清楚您到底想要什么,但是使用jQuery delferred和本机承诺,delferred有一些本机承诺没有的非标准方法
所以为了节省时间,我总是假设有一个表格
,它有一个然后
,你几乎可以做任何你想做的事情
jQuery延迟的行为也不像本机承诺(取决于版本):
因此,使用本机承诺和polyfill来实现类似于本机的行为将是一种节约
要回答关于“无过失承诺”的问题,如果您希望发出请求,但在请求拒绝时返回默认值,并在解决或拒绝后继续返回相同值,则可以执行以下操作:
const get = (p=>{
(url) => {
p = p ||
//return native promise or properly polyfilled one
Promise.resolve($.get(url))
.then(
undefined,
_=> {defaultobject:true}
);
return p;
}
})();
get函数将返回本机承诺,因此不会出现失败
、完成
以及其他非标准的情况。将来自不同库的“承诺”与本机承诺相结合,最好只使用然后不清楚您真正想要的是什么,但是使用jQuery Deferred和本机承诺时,会很麻烦,Deferred有一些本机承诺没有的非标准方法
所以为了节省时间,我总是假设有一个表格
,它有一个然后
,你几乎可以做任何你想做的事情
jQuery延迟的行为也不像本机承诺(取决于版本):
因此,使用本机承诺和polyfill来实现类似于本机的行为将是一种节约
要回答关于“无过失承诺”的问题,如果您希望发出请求,但在请求拒绝时返回默认值,并在解决或拒绝后继续返回相同值,则可以执行以下操作:
const get = (p=>{
(url) => {
p = p ||
//return native promise or properly polyfilled one
Promise.resolve($.get(url))
.then(
undefined,
_=> {defaultobject:true}
);
return p;
}
})();
get函数将返回本机承诺,因此不会出现失败
、完成
以及其他非标准的情况。将来自不同库的“承诺”与本机承诺相结合,最好只使用,然后那么.always()
呢get()
是一种ajax方法,所以期望它总是能成功完成不是不可能吗?所以如果你不能,那么也许always()
会有帮助吗?我想我可以做到。我不希望执行$.get()
,尽管我可以将url更改为无害的内容。您可以用任何返回承诺的内容替换$.get()