Javascript 总是成功的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

我有以下代码jQuery代码片段:

$.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()