1

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

Init 完成后需要加载元数据 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;
    }

}
4

1 回答 1

4
.then(console.log('after Init'));

在这里,您调用 console.log并将结果 ( undefined) 传递给then. 您需要传递一个回调函数,就像您在initBreezeMetaData

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

return true;

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

于 2013-07-24T12:59:56.373 回答