Javascript 回报一个承诺就等于“回报一个承诺”;提供的参数不匹配";打字
我正在转换jQuery插件,以使用<代码>承诺>代码>而不是<代码>回调< /代码>。这应该是非常基本的,但不确定问题是我链接承诺的方法、我的返回类型还是过于挑剔的类型脚本 我不断地发现这个错误:Javascript 回报一个承诺就等于“回报一个承诺”;提供的参数不匹配";打字,javascript,jquery,typescript,promise,Javascript,Jquery,Typescript,Promise,我正在转换jQuery插件,以使用承诺>代码>而不是回调< /代码>。这应该是非常基本的,但不确定问题是我链接承诺的方法、我的返回类型还是过于挑剔的类型脚本 我不断地发现这个错误: Error 27 Supplied parameters do not match any signature of call target: Type '(value: {}) => {}' requires a call signature, but type 'JQueryPromise&l
Error 27 Supplied parameters do not match any signature of call target:
Type '(value: {}) => {}' requires a call signature, but type 'JQueryPromise<any>' lacks one.
错误27提供的参数与调用目标的任何签名不匹配:
类型“(值:{})=>{}”需要调用签名,但类型“JQueryPromise”缺少调用签名。
my function的精简版本如下所示:
_navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
{
var dfd = $.Deferred();
switch (target)
{
// '_self' is a full page load link
case '_self':
setTimeout(function ()
{
window.location.href = url;
}, 0);
// Return empty promise - as we are about to lose the page
dfd.resolve(true);
break;
// _back re-displays a panel already loaded
case '_back':
// Fetch a reference to the panel before this one
var $existingPanel = THIS._getNextPanel($panel, false);
// >>>> ERROR ON NEXT LINE <<<<<<
// This will animate back in the previous panel - promise on complete
dfd = dfd.then(THIS._gotoPanel($existingPanel, false, true, target));
break;
// [SNIP]
}
return dfd.promise();
}
\u导航(前进:布尔,$panel:JQuery,目标:字符串):JQueryPromise
{
var dfd=$.Deferred();
交换机(目标)
{
//“\u self”是一个完整的页面加载链接
案例“_self”:
setTimeout(函数()
{
window.location.href=url;
}, 0);
//返回空的承诺-因为我们即将失去这一页
dfd.resolve(正确);
打破
//\u back重新显示已加载的面板
案例“\u back”:
//在此面板之前获取对该面板的引用
var$existingPanel=THIS.\u getNextPanel($panel,false);
//>>>>下一行的错误未测试,但我想您需要向然后
提供类型信息,例如然后
如果没有,jQuery将另一个JQueryPromise
包装在中函数的返回类型周围,然后
无论如何,我个人不会将该方法封装在$.Deferred()
,而是宁愿返回$。when(true)
而不是dfd.resolve(true)
,并直接返回THIS.\u gotoPanel(…)
编辑
var d=$.Deferred();d=d.then(废话);返回d.promise()
不会飞
如果用延迟的
进行包装,则应包括以下内容:
_navigate(forward: boolean, $panel: JQuery, target: string): JQueryPromise<any>
{
return $.Deferred(dfd => {
switch (target) {
// '_self' is a full page load link
case '_self':
....
dfd.resolve(true);
break;
case '_back':
THIS._gotoPanel($existingPanel, false, true, target)).then(
() => { dfd.resolve(whatever); },
err => { dfd.reject(err); }
)
break;
}
}).promise();
}
\u导航(前进:布尔,$panel:JQuery,目标:字符串):JQueryPromise
{
返回延迟的美元(dfd=>{
交换机(目标){
//“\u self”是一个完整的页面加载链接
案例“_self”:
....
dfd.resolve(正确);
打破
案例“\u back”:
这个._gotoPanel($existingPanel,false,true,target))。然后(
()=>{dfd.resolve(无论什么);},
err=>{dfd.reject(err);}
)
打破
}
}).promise();
}
如果不是JQueryPromise,而不是promise,我的返回类型应该是什么样的
我想你只是想
dfd = THIS._gotoPanel($existingPanel, false, true, target);
因为dfd
在\u back
案例中根本无法解决。这是一个简化的例子。我经常需要运行多个承诺,有时并行,有时顺序,所以返回另一个调用没有帮助。只需选中。dfd。然后(…)
未编译,但感谢您的建议。好的。仍然是构造var d=$.Deferred();d=d.then(blah);return d.promise()
无法运行(在代码段上尝试)。我认为你必须将一切扭曲成一个延迟的,并始终解决/拒绝或连锁承诺。基本上,你建议通过捕捉每个孩子承诺的完成和拒绝并通过解决和拒绝传回结果来进行连锁。这将工作,只是不像我希望的那么简单。是的,或者使用$。当技巧我同意这个样板。目前写了很多这样的东西,我发现我写的代码太多了。我还发现我需要在几乎每一个然后上指定类型,以避免高编译时间和编译错误。一些人报告说Q
是一个更好的框架;我有没有测试,这很有意义。假设我有多个承诺要组合(所以dfd=THIS.\u gotoPanel($existingPanel,false,true,target);
不起作用,你建议的链接承诺的方法是什么?你想如何组合它们?链接是否意味着它们是按顺序执行的,因为它们取决于以前的结果?请展示你的整个代码。有趣。我很想知道链接多个调用时这是如何工作的,例如doThat()。然后()=>{dfd=doThis()}
因为您将来会以某种方式重新分配闭包变量dfd
。这是行不通的。then
的要点是,它会返回一个对将来回调生成的承诺结果的承诺:dfd=doThis()。然后(()=>{return doThis()})
@Bergi我不喜欢重新分配dfd
的想法,我觉得应该将其视为最终的final
。然而,将其重新分配给未来的第一个调用应该是可以的。无论如何,如果你连锁,为什么首先要将$.Deferred()
分配给dfd?var dfd=doThat()。然后(()=>{return doThis()})
已经足够好了。如果您想立即解决:var dfd=$。when(resolveThis)
很好(据我所知,这是一种常见的模式)。
dfd = THIS._gotoPanel($existingPanel, false, true, target);