【问题标题】:Why does this call not wait for the response before continuing?为什么此呼叫在继续之前不等待响应?
【发布时间】:2013-07-24 20:59:56
【问题描述】:

当我运行这段代码时,这是 Chrome 调试工具中的结果:

需要加载元数据 初始化后 完成z

我原以为“after init”只会在“finished z”代码触发后出现,但它似乎之前会返回。为什么是这样? (我不熟悉 JS 中的 Promise 和异步编程)

Class1.js:

 function activate()
    {
        dataServiceHelper.initBreezeMetaData().then(console.log('after Init'));
    }

dataServiceHelper.js:

function initBreezeMetaData()
{
    if (manager.metadataStore.isEmpty())
    {
        console.log('need to load metadata');
        return manager.fetchMetadata().then(function ()
        {
            console.log('loaded metadata for ' + config.serviceUrl);
        }).fin(function ()
        {
            console.log('finished z');
        });
    } else
    {
        return true;
    }

}

【问题讨论】:

    标签: javascript promise


    【解决方案1】:
    .then(console.log('after Init'));
    

    您在此处调用 console.log 并将结果 (undefined) 传递给 then。你需要传递一个回调函数,就像你在initBreezeMetaData中所做的那样:

    dataServiceHelper.initBreezeMetaData().then(function() {
        console.log('after Init');
    });
    

    return true;
    

    如果initBreezeMetaData 函数返回一个promise,它应该总是返回一个promise。当调用者想要对结果调用 .then 方法时,返回布尔值会导致异常……

    【讨论】:

    • 太好了,感谢您的解释。因此,如果您的 cmets 始终返回 Promise - 如果我并不总是需要调用 manager.fetchMetadata(),我将如何在我的 initBreezeMetaData 方法中执行此操作?
    • 我不确定那个管理器和它的元数据存储已经做了什么,但理论上你应该记住函数的结果。第一次调用initMetaData 时,它将调用管理器获取元数据,并存储该承诺。在获取过程中,将使用存储的待处理承诺来应答进一步的调用;然后调用就可以返回已履行的承诺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2012-11-17
    • 2020-01-18
    • 2014-07-12
    • 2016-04-02
    • 2016-06-02
    • 2015-01-21
    相关资源
    最近更新 更多