Javascript 回报一个承诺就等于“回报一个承诺”;提供的参数不匹配";打字

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

我正在转换jQuery插件,以使用<代码>承诺>代码>而不是<代码>回调< /代码>。这应该是非常基本的,但不确定问题是我链接承诺的方法、我的返回类型还是过于挑剔的类型脚本

我不断地发现这个错误:

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);